#include <tinyxml2.h>
#include <cstring>
#include "config.hpp"

using namespace tinyxml2;

constexpr configData defaultConfig = {0.7, 0.7, 0};

Config::Config()
{
    Load();
}

void Config::Load()
{
    XMLDocument doc;
    if (doc.LoadFile("config.xml") != XML_SUCCESS) {
        LoadDefaults();
        return;
    }

    data.musicVolume = doc.RootElement()->FloatAttribute("music-volume", defaultConfig.musicVolume);
    data.soundVolume = doc.RootElement()->FloatAttribute("sound-volume", defaultConfig.soundVolume);
    data.calibration = doc.RootElement()->FloatAttribute("calibration", defaultConfig.calibration);

    CancelEdit();
}

void Config::SaveEdit()
{
    XMLDocument doc;

    doc.InsertEndChild(doc.NewElement("config"));

    doc.RootElement()->SetAttribute("music-volume", editData.musicVolume);
    doc.RootElement()->SetAttribute("sound-volume", editData.soundVolume);
    doc.RootElement()->SetAttribute("calibration", editData.calibration);

    doc.SaveFile("config.xml");

    memcpy(&data, &editData, sizeof(configData));
}

void Config::LoadDefaultEdit()
{
    memcpy(&editData, &defaultConfig, sizeof(configData));
}

void Config::CancelEdit()
{
    memcpy(&editData, &data, sizeof(configData));
}

void Config::LoadDefaults()
{
    LoadDefaultEdit();
    SaveEdit();
}

const configData &Config::getConfig()
{
    return this->data;
}

