#pragma once

#include <getopt.h>

#include <map>
#include <string>

namespace witherspoon
{
namespace power
{

/** @brief Class - Encapsulates parsing command line options and
 *                 populating arguments
 */
class ArgumentParser
{
  public:
    ArgumentParser() = delete;
    ~ArgumentParser() = default;
    ArgumentParser(const ArgumentParser&) = delete;
    ArgumentParser& operator=(const ArgumentParser&) = delete;
    ArgumentParser(ArgumentParser&&) = default;
    ArgumentParser& operator=(ArgumentParser&&) = default;

    /** @brief Constructs Argument object
     *
     *  @param[in] argc - the main function's argc passed as is
     *  @param[in] argv - the main function's argv passed as is
     *  @return Object constructed
     */
    ArgumentParser(int argc, char** argv);

    /** @brief Given an option, returns its argument(optarg)
     *
     *  @param[in] opt - command line option string
     *
     *  @return argument which is a standard optarg
     */
    const std::string& operator[](const std::string& opt);

    /** @brief Displays usage
     *
     *  @param[in] argv - the main function's argv passed as is
     */
    static void usage(char** argv);

    /** @brief Set to 'true' when an option is passed */
    static const std::string trueString;

    /** @brief Set to '' when an option is not passed */
    static const std::string emptyString;

  private:
    /** @brief Option to argument mapping */
    std::map<const std::string, std::string> arguments;

    /** @brief Array of struct options as needed by getopt_long */
    static const option options[];

    /** @brief optstring as needed by getopt_long */
    static const char* optionStr;
};

} // namespace power
} // namespace witherspoon
