#pragma once

#include <SDL3/SDL.h>

#include <string>  // Para string, basic_string
#include <utility>
#include <vector>  // Para vector

/**
 * @brief Tracker global de llaves recogidas (singleton)
 *
 * Mantiene un registro por habitación de las posiciones de las llaves recogidas,
 * de modo que al volver a entrar a una habitación las llaves ya cogidas no
 * vuelvan a aparecer. Mismo patrón que ItemTracker.
 */
class KeyTracker {
   public:
    // Gestión singleton
    static void init();                // Inicialización
    static void destroy();             // Destrucción
    static auto get() -> KeyTracker*;  // Acceso al singleton

    // Gestión de llaves recogidas
    auto hasBeenPicked(const std::string& name, SDL_FPoint pos) -> bool;  // Comprueba si la llave ya ha sido cogida
    void addKey(const std::string& name, SDL_FPoint pos);                 // Añade la llave a la lista
    void clear();                                                         // Vacía el tracker (reset de partida)

   private:
    // Tipos anidados privados
    struct Data {
        std::string name;             // Nombre de la habitación
        std::vector<SDL_FPoint> pos;  // Lista de posiciones de llaves cogidas

        // Constructor para facilitar creación con posición inicial
        Data(std::string name, const SDL_FPoint& position)
            : name(std::move(name)) {
            pos.push_back(position);
        }
    };

    // Constantes privadas
    static constexpr int NOT_FOUND = -1;  // Valor de retorno cuando no se encuentra un elemento

    // Constantes singleton
    static KeyTracker* key_tracker;  // [SINGLETON] Objeto privado

    // Métodos privados
    auto findByName(const std::string& name) -> int;   // Busca una entrada en la lista por nombre
    auto findByPos(int index, SDL_FPoint pos) -> int;  // Busca una entrada en la lista por posición

    // Constructor y destructor privados [SINGLETON]
    KeyTracker() = default;
    ~KeyTracker() = default;

    // Variables miembro
    std::vector<Data> keys_;  // Lista de llaves recogidas por habitación
};
