/*
 * 86Box    A hypervisor and IBM PC system emulator that specializes in
 *          running old operating systems and software designed for IBM
 *          PC systems and compatibles from 1981 through fairly recent
 *          system designs based on the PCI bus.
 *
 *          This file is part of the 86Box distribution.
 *
 *          86Box VM manager configuration module
 *
 * Authors: cold-brewed
 *
 *          Copyright 2024 cold-brewed
 */
#include <QDebug>
#include <QDir>
#include "qt_vmmanager_config.hpp"

extern "C" {
#include <86box/plat.h>
#include <86box/version.h>
}

QVariantHash VMManagerConfig::generalDefaults = {
    { "hide_tool_bar",   0 },
    { "regex_search",    0 },
#if EMU_BUILD_NUM != 0
    { "update_check",    1 },
#endif
    { "window_remember", 0 }
};

VMManagerConfig::VMManagerConfig(const ConfigType type, const QString &section)
{
    char BUF[256];
    plat_get_global_config_dir(BUF, 255);
    const auto configDir  = QString(BUF);
    const auto configFile = QDir::cleanPath(configDir + "/" + "vmm.ini");

    config_type = type;

    settings = new QSettings(configFile, QSettings::IniFormat, this);
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    settings->setIniCodec("UTF-8");
#endif
    settings->setFallbacksEnabled(false);
    if (type == ConfigType::System && !section.isEmpty()) {
        settings->beginGroup(section);
    } else {
        settings->beginGroup("");
    }
}

VMManagerConfig::~VMManagerConfig()
{
    settings->endGroup();
}

QString
VMManagerConfig::getStringValue(const QString &key) const
{
    auto defaultValue = QVariant();
    if ((config_type == ConfigType::General) && (generalDefaults.contains(key)))
        defaultValue = generalDefaults[key];
    const auto value = settings->value(key, defaultValue);
    // An invalid QVariant with toString will give a default QString value which is blank.
    // Therefore any variables that do not exist will return blank strings
    return value.toString();
}

void
VMManagerConfig::setStringValue(const QString &key, const QString &value) const
{
    if (value.isEmpty()) {
        remove(key);
        return;
    }
    settings->setValue(key, value);
}

void
VMManagerConfig::remove(const QString &key) const
{
    settings->remove(key);
}

void
VMManagerConfig::sync() const
{
    settings->sync();
}
