#pragma once

#include <getopt.h>
#include <map>
#include <string>
#include <vector>

namespace phosphor
{
namespace watchdog
{
/** @brief Class ArgumentParser - 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 ArgumentParser 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 * const argv[]);

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

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

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

    private:
        /** @brief Option to argument mapping */
        std::map<const std::string, std::vector<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 watchdog
} // namespace phosphor
