#pragma once

#include <SDL3/SDL.h>

#include <memory>
#include <string>  // for string, basic_string
class Asset;
class Game;
class Input;
class Intro;
class Lang;
class Logo;
class Screen;
class Title;
struct options_t;
struct section_t;

// Textos
constexpr const char *WINDOW_CAPTION = "© 2020 Coffee Crisis — JailDesigner";

// Secciones activas del Director
enum class ActiveSection { None,
    Logo,
    Intro,
    Title,
    Game };

class Director {
   private:
    // Objetos y punteros
    SDL_Window *window;      // La ventana donde dibujamos
    SDL_Renderer *renderer;  // El renderizador de la ventana
    Screen *screen;          // Objeto encargado de dibujar en pantalla
    Input *input;            // Objeto Input para gestionar las entradas
    Lang *lang;              // Objeto para gestionar los textos en diferentes idiomas
    Asset *asset;            // Objeto que gestiona todos los ficheros de recursos
    section_t *section;      // Sección y subsección actual del programa;

    // Secciones del juego
    ActiveSection activeSection;
    std::unique_ptr<Logo> logo;
    std::unique_ptr<Intro> intro;
    std::unique_ptr<Title> title;
    std::unique_ptr<Game> game;

    // Variables
    struct options_t *options;   // Variable con todas las opciones del programa
    std::string executablePath;  // Path del ejecutable
    std::string systemFolder;    // Carpeta del sistema donde guardar datos

    // Inicializa jail_audio
    void initJailAudio();

    // Arranca SDL y crea la ventana
    bool initSDL();

    // Inicializa el objeto input
    void initInput();

    // Inicializa las opciones del programa
    void initOptions();

    // Asigna variables a partir de dos cadenas
    bool setOptions(options_t *options, std::string var, std::string value);

    // Crea el indice de ficheros
    bool setFileList();

    // Carga el fichero de configuración
    bool loadConfigFile();

    // Guarda el fichero de configuración
    bool saveConfigFile();

    // Comprueba los parametros del programa
    void checkProgramArguments(int argc, const char *argv[]);

    // Crea la carpeta del sistema donde guardar datos
    void createSystemFolder(const std::string &folder);

    // Gestiona las transiciones entre secciones
    void handleSectionTransition();

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

    // Destructor
    ~Director();

    // Ejecuta un frame del juego
    SDL_AppResult iterate();

    // Procesa un evento
    SDL_AppResult handleEvent(SDL_Event *event);
};
