#pragma once

#include <SDL3/SDL.h>

#include <string>         // Para string
#include <unordered_map>  // Para unordered_map
#include <vector>         // Para vector

// Entrada de tecla cargada desde keys.yaml
struct KeyEntry {
    std::string id;                     // Identificador usado en código (ej. "grid", "tile_picker")
    std::string display_key;            // Texto para mostrar en HELP KEYS (ej. "G", "T")
    std::string desc;                   // Descripción corta
    SDL_Keycode keycode{SDLK_UNKNOWN};  // Tecla SDL asignada
    std::string action;                 // (Opcional) Nombre de InputAction para scope GLOBAL
};

// Grupo de teclas por ámbito
struct KeyConfigScope {
    std::string name;  // "GLOBAL", "EDITOR", "MINIMAP", "DEBUG"
    std::vector<KeyEntry> entries;
    std::unordered_map<std::string, size_t> index;  // id → posición en entries
};

// Registro centralizado de teclas — fuente única de verdad (keys.yaml)
class KeyConfig {
   public:
    // Singleton
    static void init(const std::string& yaml_path);
    static void destroy();
    static auto get() -> KeyConfig*;

    // Consulta la SDL_Keycode asignada a un id dentro de un scope
    [[nodiscard]] auto key(const std::string& scope, const std::string& id) const -> SDL_Keycode;

    // Aplica las teclas del scope GLOBAL al sistema de Input (Input::bindKey)
    void applyGlobalBindings() const;

    // Acceso a scopes para HELP KEYS y para aplicar bindings globales
    [[nodiscard]] auto getScopes() const -> const std::vector<KeyConfigScope>&;
    [[nodiscard]] auto getScope(const std::string& name) const -> const KeyConfigScope*;

   private:
    static KeyConfig* instance;

    KeyConfig() = default;
    ~KeyConfig() = default;

    void load(const std::string& yaml_path);

    std::vector<KeyConfigScope> scopes_;
    std::unordered_map<std::string, size_t> scope_index_;  // nombre → posición en scopes_
};
