#pragma once

#include <string> // Para manejar cadenas de texto
namespace lang
{
	enum class Code : int;
}

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

	// Destructor
	~Director();

	// Bucle principal de la aplicación
	int run();

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
	void close(); // Cierra y libera recursos

	// Configuración inicial
	void loadParams();									// Carga los parámetros del programa
	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 bindInputs();										  // Asigna botones y teclas al sistema de entrada
	void setFileList();										  // Crea el índice de archivos disponibles
	void checkProgramArguments(int argc, const char *argv[]); // Verifica los parámetros del programa

	// Diferentes secciones del programa
	void runLogo();			// Ejecuta la pantalla con el logo
	void runIntro();		// Ejecuta la introducción del juego
	void runTitle();		// Ejecuta la pantalla de título
	void runGame();			// Inicia el juego
	void runInstructions(); // Muestra las instrucciones
	void runCredits();		// Muestra los créditos del juego
	void runHiScoreTable(); // Muestra la tabla de puntuaciones
	void runDemoGame();		// Ejecuta el modo demo
	void runInit();			// Ejecuta la fase de inicialización

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

#ifdef ARCADE
	void shutdownSystem(bool should_shutdown); // Apaga el sistema (modo arcade)
#endif
};
