#pragma once

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

#include "game/gameplay/zone.hpp"  // Para Zone::Data

/**
 * @brief Singleton que carga y gestiona el catálogo de zonas
 *
 * Carga data/zones/zones.yaml en init() y permite consultar zonas por nombre.
 * El loader usa Resource::Helper::loadFile, que soporta tanto el resource pack
 * como el filesystem (modo desarrollo). Por eso ZoneManager no depende del
 * Resource::Cache y puede inicializarse en cualquier momento antes de
 * RoomFormat::loadYAML.
 */
class ZoneManager {
   public:
    // Gestión singleton
    static void init();                 // Carga zones.yaml y crea el singleton
    static void destroy();              // Destruye el singleton
    static auto get() -> ZoneManager*;  // Acceso al singleton

    /**
     * @brief Devuelve la zona con el nombre indicado, o nullptr si no existe
     */
    [[nodiscard]] auto getZone(const std::string& name) const -> const Zone::Data*;

    /**
     * @brief Devuelve la zona por defecto (primera del fichero), o nullptr si no hay zonas
     *
     * Se usa como fallback cuando una room.yaml no especifica zone o especifica
     * una zona desconocida.
     */
    [[nodiscard]] auto getDefaultZone() const -> const Zone::Data*;

    /**
     * @brief Devuelve la lista de nombres de todas las zonas (para validación en editor)
     */
    [[nodiscard]] auto getZoneNames() const -> std::vector<std::string>;

   private:
    // Constantes singleton
    static ZoneManager* zone_manager;  // [SINGLETON] Objeto privado

    // Constructor y destructor privados [SINGLETON]
    ZoneManager() = default;
    ~ZoneManager() = default;

    // Carga el yaml y rellena zones_
    void loadFromFile(const std::string& file_path);

    // Variables miembro
    std::vector<Zone::Data> zones_;  // Catálogo de zonas
};
