#pragma once

#include <SDL3/SDL.h>

#include <string>
#include <unordered_map>
#include <vector>

// KeyConfig: font única de veritat per a les tecles d'UI/sistema.
//
// Llegeix els valors per defecte des de `data/input/keys.yaml` (recurs read-only)
// i opcionalment aplica overrides des d'un fitxer de l'usuari (per a remapejos
// fets des del menú de servei). Els callers consulten per `id` (ex. "menu_toggle").
//
// Les tecles de moviment del jugador NO viuen ací — es queden a Options::keys_game.

struct KeyEntry {
    std::string id;
    std::string code;  // nom SDL del scancode tal com apareix al YAML
    std::string desc;
    SDL_Scancode scancode{SDL_SCANCODE_UNKNOWN};
    SDL_Scancode default_scancode{SDL_SCANCODE_UNKNOWN};
};

namespace KeyConfig {
    // Inicialitza KeyConfig llegint defaults des d'un recurs (via ResourceHelper)
    // i opcionalment sobreposant overrides des d'un fitxer de disc.
    void init(const std::string& defaults_resource_path,
        const std::string& user_overrides_disk_path);
    void destroy();

    // Consulta el scancode actual associat a un id. Torna SDL_SCANCODE_UNKNOWN si no existix.
    [[nodiscard]] auto scancode(const std::string& id) -> SDL_Scancode;

    // Punter estable al scancode d'un id — útil per a Menu::ItemKind::KeyBind.
    // Torna nullptr si l'id no existix.
    [[nodiscard]] auto scancodePtr(const std::string& id) -> SDL_Scancode*;

    // Estableix el scancode d'un id. No persistix per si sol — cal cridar saveOverrides().
    void setScancode(const std::string& id, SDL_Scancode sc);

    // True si el scancode coincidix amb alguna tecla d'UI registrada.
    // Usat pel Director per a evitar que tecles d'UI activen `key_pressed_` al joc.
    [[nodiscard]] auto isGuiKey(SDL_Scancode sc) -> bool;

    // Llistat complet de les entrades (per a HELP / debug / iteració).
    [[nodiscard]] auto entries() -> const std::vector<KeyEntry>&;

    // Persistix al fitxer d'overrides les entrades que difereixen del default.
    // Si no s'ha proporcionat user_overrides_disk_path al init, és no-op.
    auto saveOverrides() -> bool;
}  // namespace KeyConfig
