#include <sstream>
#include "argparse_util.hpp"

namespace argparse {
    
    template<typename T, typename Converter>
    std::shared_ptr<Argument> make_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
        auto ptr = std::make_shared<SingleValueArgument<T, Converter>>(dest, long_opt, short_opt);

        //If the conversion object specifies a non-empty set of choices
        //use those by default
        auto default_choices = Converter().default_choices();
        if (!default_choices.empty()) {
            ptr->choices(default_choices);
        }

        return ptr;
    }

    /*
     * ArgumentParser
     */

    template<typename T, typename Converter>
    Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string option) {
        return add_argument<T,Converter>(dest, option, std::string());
    }

    template<typename T, typename Converter>
    Argument& ArgumentParser::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
        return argument_groups_[0].add_argument<T,Converter>(dest, long_opt, short_opt);
    }

    /*
     * ArgumentGroup
     */
    template<typename T, typename Converter>
    Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string option) {
        return add_argument<T,Converter>(dest, option, std::string());
    }

    template<typename T, typename Converter>
    Argument& ArgumentGroup::add_argument(ArgValue<T>& dest, std::string long_opt, std::string short_opt) {
        arguments_.push_back(make_argument<T,Converter>(dest, long_opt, short_opt));

        auto& arg = arguments_[arguments_.size() - 1];
        arg->group_name(name()); //Tag the option with the group
        return *arg;
    }

} //namespace
