// SPDX-License-Identifier: Apache-2.0
// SPDX-FileCopyrightText: Copyright 2018 IBM Corporation

#include "argument.hpp"

#include <iostream>

namespace phosphor
{
namespace network
{
namespace ncsi
{

ArgumentParser::ArgumentParser(int argc, char** argv)
{
    int option = 0;
    while (-1 != (option = getopt_long(argc, argv, optionStr, options, NULL)))
    {
        if ((option == '?') || (option == 'h'))
        {
            usage(argv);
            exit(-1);
        }

        auto i = &options[0];
        while ((i->val != option) && (i->val != 0))
        {
            ++i;
        }

        if (i->val)
        {
            arguments[i->name] = (i->has_arg ? optarg : trueString);
        }
    }
}

const std::string& ArgumentParser::operator[](const std::string& opt)
{
    auto i = arguments.find(opt);
    if (i == arguments.end())
    {
        return emptyString;
    }
    else
    {
        return i->second;
    }
}

void ArgumentParser::usage(char* const* argv)
{
    std::cerr << "Usage: " << argv[0] << " [options]\n";
    std::cerr
        << "Options:\n"
           "    --help | -h       Print this menu.\n"
           "    --index=<device index> | -x <device index> Specify device ifindex.\n"
           "    --package=<package> | -p <package> Specify a package.\n"
           "    --channel=<channel> | -c <channel> Specify a channel.\n"
           "    --info  | -i      Retrieve info about NCSI topology.\n"
           "    --set   | -s      Set a specific package/channel.\n"
           "    --clear | -r      Clear all the settings on the interface.\n"
           "    --pmask=<mask> | -j <mask> Bitmask to enable/disable packages\n"
           "    --cmask=<mask> | -k <mask> Bitmask to enable/disable channels\n"
           "\n"
           "Example commands:\n"
           "    1) Retrieve topology information:\n"
           "         ncsi-netlink -x 3 -p 0 -i\n"
           "    2) Set preferred package\n"
           "         ncsi-netlink -x 3 -p 0 -s\n"
           "    3) Set preferred channel\n"
           "         ncsi-netlink -x 3 -p 0 -c 1 -s\n"
           "    4) Clear preferred channel\n"
           "         ncsi-netlink -x 3 -p 0 -r\n"
           "    5) Set Package Mask\n"
           "         ncsi-netlink -x 3 -j 1\n"
           "    6) Set Channel Mask\n"
           "         ncsi-netlink -x 3 -p 0 -k 1\n"
           "\n";
}

const option ArgumentParser::options[] = {
    {"info", no_argument, NULL, 'i'},
    {"set", no_argument, NULL, 's'},
    {"clear", no_argument, NULL, 'r'},
    {"oem-payload", required_argument, NULL, 'o'},
    {"package", required_argument, NULL, 'p'},
    {"channel", required_argument, NULL, 'c'},
    {"index", required_argument, NULL, 'x'},
    {"help", no_argument, NULL, 'h'},
    {"pmask", required_argument, NULL, 'j'},
    {"cmask", required_argument, NULL, 'k'},
    {0, 0, 0, 0},
};

const char* ArgumentParser::optionStr = "irsj:k:x:o:p:c:h?";

const std::string ArgumentParser::trueString = "true";
const std::string ArgumentParser::emptyString = "";

} // namespace ncsi
} // namespace network
} // namespace phosphor
