#pragma once

#include <SDL3/SDL.h>

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

/**
 * @brief Tracker global de puertas abiertas (singleton)
 *
 * Mantiene un registro por habitación de las posiciones de las puertas que
 * ya han sido abiertas, de modo que al volver a entrar a una habitación las
 * puertas ya abiertas se reconstruyen directamente en estado OPENED.
 * Mismo patrón que ItemTracker.
 */
class DoorTracker {
   public:
    // Gestión singleton
    static void init();                 // Inicialización
    static void destroy();              // Destrucción
    static auto get() -> DoorTracker*;  // Acceso al singleton

    // Gestión de puertas abiertas
    auto hasBeenOpened(const std::string& name, SDL_FPoint pos) -> bool;  // Comprueba si la puerta ya está abierta
    void addDoor(const std::string& name, SDL_FPoint pos);                // Marca la puerta como abierta
    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 puertas abiertas

        // 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 DoorTracker* door_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]
    DoorTracker() = default;
    ~DoorTracker() = default;

    // Variables miembro
    std::vector<Data> doors_;  // Lista de puertas abiertas por habitación
};
