#pragma once

#include <SDL3/SDL.h>

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

#include "game/entities/item.hpp"  // Para Item, Item::Data
#include "scoreboard.hpp"          // Para Scoreboard::Data

/**
 * @brief Gestor de items de una habitación
 *
 * Responsabilidades:
 * - Almacenar y gestionar la colección de items
 * - Actualizar todos los items
 * - Renderizar todos los items
 * - Detectar colisiones con items y gestionar pickup
 * - Integración con ItemTracker, Scoreboard y Audio
 */
class ItemManager {
   public:
    /**
     * @brief Constructor
     * @param room_id Identificador de la habitación (para ItemTracker)
     * @param scoreboard_data Puntero compartido a los datos del scoreboard
     */
    ItemManager(std::string room_id, std::shared_ptr<Scoreboard::Data> scoreboard_data);
    ~ItemManager() = default;

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

    // Gestión de items
    void addItem(std::shared_ptr<Item> item);  // Añade un item a la colección
    void clear();                              // Elimina todos los items

    // Actualización y renderizado
    void update(float delta_time);  // Actualiza todos los items
    void render();                  // Renderiza todos los items

    // Estado
    void setPaused(bool paused);  // Pausa/despausa todos los items

#ifdef _DEBUG
    [[nodiscard]] auto getCount() const -> int { return static_cast<int>(items_.size()); }  // Número de items
    auto getItem(int index) -> std::shared_ptr<Item>& { return items_.at(index); }          // Acceso a un item por índice
#endif

    // Detección de colisiones
    /**
     * @brief Comprueba si hay colisión con algún item
     *
     * Si hay colisión:
     * - Añade el item a ItemTracker
     * - Elimina el item de la colección
     * - Reproduce el sonido de pickup
     * - Actualiza el scoreboard y estadísticas
     *
     * @param rect Rectángulo de colisión
     * @return true si hubo colisión, false en caso contrario
     */
    auto checkCollision(SDL_FRect& rect) -> bool;

   private:
    std::vector<std::shared_ptr<Item>> items_;  // Colección de items
    std::string room_id_;                       // Identificador de la habitación
    std::shared_ptr<Scoreboard::Data> data_;    // Datos del scoreboard
};
