#pragma once

#include <QtCore>
#include "Option.h"

namespace commandline
{

template <class T>
class SwitchOption: public Option
{
public:
	SwitchOption(const QString &name,
                 const QString &description = QString(),
                 const QString &valueName = QString(),
                 const QString &defaultValue = QString(),
				 const QMap<QString, T> &switches=QMap<QString, T>())
        : Option(name, description, valueName, defaultValue), _switches(switches)
    {}
    SwitchOption(const QStringList &names,
                 const QString &description = QString(),
                 const QString &valueName = QString(),
                 const QString &defaultValue = QString(),
                 const QMap<QString, T> &switches=QMap<QString, T>())
        : Option(names, description, valueName, defaultValue), _switches(switches)
    {}
    SwitchOption(const QCommandLineOption &other, const QMap<QString, T> &switches)
        : Option(other), _switches(switches)
    {}

    const QMap<QString, T> &getSwitches() const{return _switches;};
    virtual bool validate(Parser &parser, QString &switch_) override{return hasSwitch(switch_);}
    bool hasSwitch(const QString &switch_){return _switches.contains(switch_.toLower());}
    void setSwitches(const QMap<QString, T> &_switches){this->_switches = _switches;}
    void addSwitch(const QString &switch_, T value=T()){_switches[switch_.toLower()] = value;}
    void removeSwitch(const QString &switch_){_switches.remove(switch_.toLower());}
	T & switchValue(Parser & parser){return _switches[value(parser).toLower()];}

protected:
    QMap<QString, T> _switches;
};

}