#pragma once

#include <SDL3/SDL.h>

#include <memory>  // Para unique_ptr
#include <string>  // Para string

#include "game/scene_manager.hpp"  // Para SceneManager::Scene
#include "game/scenes/scene.hpp"   // Para Scene base

class Director {
   public:
    Director();   // Constructor: inicialitza sistemes i crea l'escena inicial
    ~Director();  // Destructor

    // SDL3 Callback API: un frame i un event
    auto iterate() -> SDL_AppResult;
    auto handleEvent(const SDL_Event& event) -> SDL_AppResult;

   private:
    // --- Variables ---
    std::string executable_path_;  // Path del ejecutable
    std::string system_folder_;    // Carpeta del sistema donde guardar datos

    std::unique_ptr<Scene> active_scene_;                                  // Escena activa
    SceneManager::Scene current_scene_{SceneManager::Scene::BOOT_LOADER};  // Tipus d'escena activa
    bool boot_loading_{true};                                              // True mientras Cache::loadStep() no haya acabado
    bool boot_waiting_for_input_{false};                                   // True si la carga acabó y Options::loading.wait_for_input está activo

    // --- Funciones ---
    void createSystemFolder(const std::string& folder);  // Crea la carpeta del sistema donde guardar datos
    void setFileList();                                  // Carga la configuración de assets desde assets.yaml
    void switchToActiveScene();                          // Construeix l'escena segons SceneManager::current
    void finishBoot();                                   // Inits que dependen del cache, ejecutado tras loadStep==done
};
