#include "../headers/ScStw.hpp"

const char *ScStw::SOCKET_MESSAGE_START_KEY = "<message>";
const char *ScStw::SOCKET_MESSAGE_END_KEY = "</message>";

const QMap<QString, ScStw::BaseStationSetting> ScStw::baseStationSettings  = {
    {"ReadySoundEnable", ScStw::ReadySoundEnableSetting},
    {"ReadySoundDelay", ScStw::ReadySoundDelaySetting},
    {"AtYourMarksSoundEnable", ScStw::AtYourMarksSoundEnableSetting},
    {"AtYourMarksSoundDelay", ScStw::AtYourMarksSoundDelaySetting},
    {"SoundVolume", ScStw::SoundVolumeSetting}
};

ScStw::BaseStationSetting ScStw::baseStationSettingFromString(QString s) {
    if(!ScStw::baseStationSettings.contains(s))
        return ScStw::InvalidSetting;

    return ScStw::baseStationSettings[s];
}

QString ScStw::baseStationSettingToString(ScStw::BaseStationSetting s)  {
    for(QString key: ScStw::baseStationSettings.keys()) {
        if(ScStw::baseStationSettings[key] == s)
            return key;
    }
    return "Invalid";
}

ScStw::BaseStationSetting ScStw::baseStationSettingfromInt(int i) {
    bool ok;
    BaseStationSetting s = ScStw::toEnumValue<ScStw::BaseStationSetting>(i, &ok);
    if(!ok)
        return InvalidSetting;
    else
        return s;
}

ScStw::SignalKey ScStw::signalKeyFromInt(int i) {
    bool ok;
    ScStw::SignalKey k = ScStw::toEnumValue<ScStw::SignalKey>(i, &ok);
    if(!ok)
        return InvalidSignal;
    else
        return k;
}

ScStw::SocketCommand ScStw::socketCommandFromInt(int i) {
    bool ok;
    SocketCommand c = ScStw::toEnumValue<ScStw::SocketCommand>(i, &ok);
    if(!ok)
        return InvalidCommand;
    else
        return c;
}

int ScStw::firmwareCompare(QString a, QString b) {
    /*
     *      * \return -3: major of a is lower than b
     *         -2: minor of a is lower than b
     *         -1: patch of a is lower than b
     *         0:  a and b are identical
     *         1: patch b is lower than a
     *         2: minor of b is lower than a
     *         3: major of b is lower than a
     */

    if(a.count(".") != 2 || a.length() != 5)
        return -4;
    int aMajor = a.split(".")[0].toInt();
    int aMinor = a.split(".")[1].toInt();
    int aPatch = a.split(".")[2].toInt();

    if(b.count(".") != 2 || a.length() != 5)
        return 4;
    int bMajor = b.split(".")[0].toInt();
    int bMinor = b.split(".")[1].toInt();
    int bPatch = b.split(".")[2].toInt();

    if(a == b)
        return 0;

    if(aMajor < bMajor)
        return -3;
    else
        return 3;

    if(aMinor < bMinor)
        return -2;
    else
        return 2;

    if(aPatch < bPatch)
        return -1;
    else
        return 1;
}
