#pragma once

#include <span>    // Para Span
#include <string>  // Para string

namespace Lang {
enum class Code : int;
}

// --- Clase Director: gestor principal de la aplicación ---
class Director {
    public:
        // --- Constructor y destructor ---
        Director(int argc, std::span<char*> argv);
        ~Director();

        // --- Bucle principal ---
        static auto run() -> int;

    private:
        // --- Variables internas ---
        std::string executable_path_;  // Ruta del ejecutable
        std::string system_folder_;    // Carpeta del sistema para almacenar datos

        // --- Inicialización y cierre del sistema ---
        void init();          // Inicializa la aplicación
        static void close();  // Cierra y libera recursos

        // --- Configuración inicial ---
        static void loadParams();                            // Carga los parámetros del programa
        static void loadScoreFile();                         // Carga el fichero de puntuaciones
        void createSystemFolder(const std::string& folder);  // Crea la carpeta del sistema

        // --- Gestión de entrada y archivos ---
        void loadAssets();                                            // Crea el índice de archivos disponibles
        void checkProgramArguments(int argc, std::span<char*> argv);  // Verifica los parámetros del programa // NOLINT(modernize-avoid-c-arrays)

        // --- Secciones del programa ---
        static void runLogo();          // Ejecuta la pantalla con el logo
        static void runIntro();         // Ejecuta la introducción del juego
        static void runTitle();         // Ejecuta la pantalla de título
        static void runGame();          // Inicia el juego
        static void runInstructions();  // Muestra las instrucciones
        static void runCredits();       // Muestra los créditos del juego
        static void runHiScoreTable();  // Muestra la tabla de puntuaciones
        static void runDemoGame();      // Ejecuta el modo demo
        static void reset();            // Reinicia objetos y vuelve a la sección inicial

        // --- Gestión de archivos de idioma ---
        auto getLangFile(Lang::Code code) -> std::string;  // Obtiene un fichero de idioma según el código

        // --- Apagado del sistema ---
        static void shutdownSystem(bool should_shutdown);  // Apaga el sistema
};
