#ifndef __ARGUMENT_H
#define __ARGUMENT_H
#include <getopt.h>
#include <map>
#include <string>

namespace phosphor
{
namespace led
{
/** @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 Contructs Argument object
         *
         *  @param argc - the main function's argc passed as is
         *  @param argv - the main function's argv passed as is
         *  @return Object constructed
         */
        ArgumentParser(int argc, char** argv);

        /** @brief Given a option, returns its argument(optarg) */
        const std::string& operator[](const std::string& opt);

        /** @brief Displays usage */
        static void usage(char** argv);

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

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

    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 led
} // namespace phosphor

#endif
