#pragma once

#include <SDL3/SDL.h>

#include <cstdint>  // for uint8_t
#include <memory>
#include <string>  // for string, basic_string
class Game;
class Intro;
class Logo;
class Title;
struct Section;

class Director {
   public:
    Director(int argc, const char *argv[]);  // Constructor
    ~Director();                              // Destructor

    Director(const Director &) = delete;
    auto operator=(const Director &) -> Director & = delete;

    auto iterate() -> SDL_AppResult;                       // Ejecuta un frame del juego
    auto handleEvent(SDL_Event *event) -> SDL_AppResult;   // Procesa un evento

   private:
    // Secciones activas del Director
    enum class ActiveSection : std::uint8_t {
        NONE,
        LOGO,
        INTRO,
        TITLE,
        GAME
    };

    static void initJailAudio();                                          // Inicializa jail_audio
    auto initSDL() -> bool;                                               // Arranca SDL y crea la ventana
    static void initInput();                                              // Inicializa el objeto input
    auto setFileList() -> bool;                                           // Crea el indice de ficheros
    static void checkProgramArguments(int argc, const char *argv[]);      // Comprueba los parametros del programa
    void createSystemFolder(const std::string &folder);                   // Crea la carpeta del sistema donde guardar datos
    void handleSectionTransition();                                       // Gestiona las transiciones entre secciones

    // Objetos y punteros
    SDL_Window *window_;      // La ventana donde dibujamos
    SDL_Renderer *renderer_;  // El renderizador de la ventana
    Section *section_;        // Sección y subsección actual del programa;

    // Secciones del juego
    ActiveSection active_section_;
    std::unique_ptr<Logo> logo_;
    std::unique_ptr<Intro> intro_;
    std::unique_ptr<Title> title_;
    std::unique_ptr<Game> game_;

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