#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para shared_ptr
#include <string>  // Para string
#include <vector>  // Para vector

#include "game/entities/key.hpp"  // Para Key, Key::Data

/**
 * @brief Gestor de llaves de una habitación
 *
 * Responsabilidades:
 * - Almacenar y gestionar la colección de llaves
 * - Actualizar y renderizar todas las llaves
 * - Detectar colisiones con el jugador y gestionar pickup
 * - Integración con Inventory (singleton global) y KeyTracker (persistencia por room)
 */
class KeyManager {
   public:
    explicit KeyManager(std::string room_id);
    ~KeyManager() = default;

    // Prohibir copia y movimiento para evitar duplicación accidental
    KeyManager(const KeyManager&) = delete;
    auto operator=(const KeyManager&) -> KeyManager& = delete;
    KeyManager(KeyManager&&) = delete;
    auto operator=(KeyManager&&) -> KeyManager& = delete;

    // Gestión de llaves
    void addKey(std::shared_ptr<Key> key);  // Añade una llave a la colección
    void clear();                           // Elimina todas las llaves

    // Actualización y renderizado
    void update(float delta_time);  // Actualiza todas las llaves
    void render();                  // Renderiza todas las llaves

    // Estado
    void setPaused(bool paused);  // Pausa/despausa todas las llaves

    /**
     * @brief Comprueba si hay colisión con alguna llave
     *
     * Si hay colisión:
     * - Añade el id de la llave al Inventory global
     * - Registra la posición en KeyTracker (para no respawnear)
     * - Elimina la llave de la colección
     * - Reproduce el sonido de pickup
     *
     * @param rect Rectángulo de colisión
     * @return true si hubo colisión, false en caso contrario
     */
    auto checkCollision(SDL_FRect& rect) -> bool;

#ifdef _DEBUG
    // --- API para el editor (debug) ---
    [[nodiscard]] auto getCount() const -> int { return static_cast<int>(keys_.size()); }
    auto getKey(int index) -> std::shared_ptr<Key>& { return keys_.at(index); }
#endif

   private:
    std::vector<std::shared_ptr<Key>> keys_;  // Colección de llaves
    std::string room_id_;                     // Identificador de la habitación
};
