#pragma once

#include <SDL3/SDL.h>

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

#include "game/entities/enemy.hpp"  // Para Enemy, Enemy::Data

/**
 * @brief Gestor de enemigos de una habitación
 *
 * Responsabilidades:
 * - Almacenar y gestionar la colección de enemigos
 * - Actualizar todos los enemigos
 * - Renderizar todos los enemigos
 * - Detectar colisiones con enemigos
 */
class EnemyManager {
   public:
    EnemyManager() = default;
    ~EnemyManager() = default;

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

    // Gestión de enemigos
    void addEnemy(std::shared_ptr<Enemy> enemy);  // Añade un enemigo a la colección
    void clear();                                 // Elimina todos los enemigos
    void removeLastEnemy();                       // Elimina el último enemigo de la colección
    [[nodiscard]] auto isEmpty() const -> bool;   // Comprueba si no hay enemigos

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

    // Detección de colisiones
    auto checkCollision(SDL_FRect& rect) -> bool;  // Comprueba si hay colisión con algún enemigo

#ifdef _DEBUG
    void updateAnimations(float delta_time);                          // Solo actualiza animaciones sin mover enemigos
    void resetPositions(const std::vector<Enemy::Data>& enemy_data);  // Resetea todos los enemigos a su posición inicial
    [[nodiscard]] auto getCount() const -> int;                       // Número de enemigos
    auto getEnemy(int index) -> std::shared_ptr<Enemy>&;              // Acceso a un enemigo por índice
#endif

   private:
    std::vector<std::shared_ptr<Enemy>> enemies_;  // Colección de enemigos
};
