#pragma once
#pragma once
#include <string>
#include <map>
#include <vector>
#include <Windows.h>
#include <fstream>
#include <sstream>
#include <filesystem>

namespace Config {

    // Путь к папке с конфигами
    inline std::string ConfigPath = "C:\\Fang\\configs\\";

    // Структура для хранения значения конфига
    struct ConfigValue {
        enum Type { BOOL, INT, FLOAT, STRING, COLOR } type;
        union {
            bool b;
            int i;
            float f;
        } data;
        std::string s;
        float color[4];

        // ← ДОБАВЬ ЭТОТ КОНСТРУКТОР:
        ConfigValue() : type(BOOL) {
            data.b = false;
            s = "";
            color[0] = color[1] = color[2] = color[3] = 0.f;
        }

        ConfigValue(bool val) : type(BOOL) { data.b = val; }
        ConfigValue(int val) : type(INT) { data.i = val; }
        ConfigValue(float val) : type(FLOAT) { data.f = val; }
        ConfigValue(const std::string& val) : type(STRING) { s = val; }
        ConfigValue(float c[4]) : type(COLOR) {
            color[0] = c[0]; color[1] = c[1];
            color[2] = c[2]; color[3] = c[3];
        }
    };

    // Менеджер конфигов
    class Manager {
    public:
        static void Init();  // ← Только объявление, без { }
        static void Save(const std::string& name);
        static void Load(const std::string& name);
        static std::vector<std::string> ListConfigs();
        static void DeleteConfig(const std::string& name);

    private:
        static std::map<std::string, ConfigValue> registry;
        static void Register(const std::string& key, const ConfigValue& value);
        static std::string Serialize(const ConfigValue& val);
        static ConfigValue Deserialize(const std::string& str, ConfigValue::Type type);
        static void ApplyConfig(const std::string& key, const ConfigValue& val);
    };

}