#pragma once

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

#include "game/entities/enemy.hpp"  // Para Enemy::Data
#include "game/entities/item.hpp"   // Para Item::Data
#include "game/gameplay/room.hpp"   // Para Room::Data

/**
 * @brief Cargador de archivos de habitaciones en formato YAML
 *
 * Responsabilidades:
 * - Cargar archivos de room en formato YAML unificado (.yaml)
 * - Parsear datos de room, tilemap, enemies e items
 * - Convertir tipos de datos (tiles, posiciones, colores)
 * - Validar y propagar errores de carga
 *
 * Esta clase contiene solo métodos estáticos y no debe instanciarse.
 */
class RoomLoader {
    public:
        // Constructor eliminado para prevenir instanciación
        RoomLoader() = delete;
        ~RoomLoader() = delete;
        RoomLoader(const RoomLoader&) = delete;
        auto operator=(const RoomLoader&) -> RoomLoader& = delete;
        RoomLoader(RoomLoader&&) = delete;
        auto operator=(RoomLoader&&) -> RoomLoader& = delete;

        /**
         * @brief Carga un archivo de room en formato YAML
         * @param file_path Ruta al archivo YAML de habitación
         * @param verbose Si true, muestra información de debug
         * @return Room::Data con todos los datos de la habitación incluyendo:
         *         - Configuración de la habitación (nombre, colores, etc.)
         * - Tilemap completo (convertido de 2D a 1D)
         *         - Lista de enemigos con todas sus propiedades
         *         - Lista de items con todas sus propiedades
         *
         * El formato YAML esperado incluye:
         * - room: configuración general
         * - tilemap: array 2D de 16x32 tiles (convertido a vector 1D de 512 elementos)
         * - enemies: lista de enemigos (opcional)
         * - items: lista de items (opcional)
         */
        static auto loadYAML(const std::string& file_path, bool verbose = false) -> Room::Data;

    private:
        /**
         * @brief Convierte room connection de YAML a formato con extensión
         * @param value Valor del YAML (null o "02")
         * @return String con extensión YAML ("0" para null, "02.yaml" para "02")
         */
        static auto convertRoomConnection(const std::string& value) -> std::string;

        /**
         * @brief Convierte un tilemap 2D a vector 1D flat
         * @param tilemap_2d Array 2D de tiles (16 rows × 32 cols)
         * @return Vector 1D flat con 512 elementos
         */
        static auto flattenTilemap(const std::vector<std::vector<int>>& tilemap_2d) -> std::vector<int>;
};
