#include <attn/attn_config.hpp>

#include <algorithm>
#include <string>

/** @brief Search the command line arguments for an option */
bool getCliOption(char** i_begin, char** i_end, const std::string& i_option)
{
    return (i_end != std::find(i_begin, i_end, i_option));
}

/** @brief Search the command line arguments for a setting value */
char* getCliSetting(char** i_begin, char** i_end, const std::string& i_setting)
{
    char** value = std::find(i_begin, i_end, i_setting);
    return (value != i_end && ++value != i_end) ? *value : 0;
}

/** @brief Parse command line for configuration flags */
void parseConfig(char** i_begin, char** i_end, attn::Config* o_config)
{
    char* setting;

    // --all on/off takes precedence over individual settings
    setting = getCliSetting(i_begin, i_end, "--all");
    if (nullptr != setting)
    {
        if (std::string("off") == setting)
        {
            o_config->clearFlagAll();
        }

        if (std::string("on") == setting)
        {
            o_config->setFlagAll();
        }
    }
    // Parse individual options
    else
    {
        setting = getCliSetting(i_begin, i_end, "--vital");
        if (nullptr != setting)
        {
            if (std::string("off") == setting)
            {
                o_config->clearFlag(attn::enVital);
            }
            if (std::string("on") == setting)
            {
                o_config->setFlag(attn::enVital);
            }
        }

        setting = getCliSetting(i_begin, i_end, "--checkstop");
        if (nullptr != setting)
        {
            if (std::string("off") == setting)
            {
                o_config->clearFlag(attn::enCheckstop);
            }
            if (std::string("on") == setting)
            {
                o_config->setFlag(attn::enCheckstop);
            }
        }

        setting = getCliSetting(i_begin, i_end, "--terminate");
        if (nullptr != setting)
        {
            if (std::string("off") == setting)
            {
                o_config->clearFlag(attn::enTerminate);
            }
            if (std::string("on") == setting)
            {
                o_config->setFlag(attn::enTerminate);
            }
        }

        setting = getCliSetting(i_begin, i_end, "--breakpoints");
        if (nullptr != setting)
        {
            if (std::string("off") == setting)
            {
                o_config->clearFlag(attn::enBreakpoints);
            }
            if (std::string("on") == setting)
            {
                o_config->setFlag(attn::enBreakpoints);
            }
        }

        // This option determines whether we service a TI or breakpoint in the
        // case where TI info is available but not valid. The default setting
        // of this is "clear" meaning we will handle breakpoint by default.
        // This flag is not affected by the set/clear all command line option.
        if (true == getCliOption(i_begin, i_end, "--defaultti"))
        {
            o_config->setFlag(attn::dfltTi);
        }

        setting = getCliSetting(i_begin, i_end, "--clrattnintr");
        if (nullptr != setting)
        {
            if (std::string("off") == setting)
            {
                o_config->clearFlag(attn::enClrAttnIntr);
            }
            if (std::string("on") == setting)
            {
                o_config->setFlag(attn::enClrAttnIntr);
            }
        }
    }
}