#pragma once

#include <SDL2/SDL_render.h>  // for SDL_Renderer
#include <SDL2/SDL_video.h>   // for SDL_Window
#include <string>             // for string, basic_string
class Asset;
class Credits;
class Debug;
class Demo;
class Ending2;
class Ending;
class Game;
class GameOver;
class Input;
class LoadingScreen;
class Logo;
class Resource;
class Screen;
class Title;
struct JA_Music_t;
struct options_t;
struct section_t;

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
	Resource *resource;			  // Objeto con los recursos
	Asset *asset;				  // Objeto que gestiona todos los ficheros de recursos
	Input *input;				  // Objeto Input para gestionar las entradas
	Game *game;					  // Objeto para gestionar la sección del juego
	Logo *logo;					  // Objeto para gestionar la sección del logo del programa
	Title *title;				  // Objeto para gestionar la pantalla de título
	LoadingScreen *loadingScreen; // Objeto para gestionar la introducción del juego
	Credits *credits;			  // Objeto para gestionar los creditos del juego
	Demo *demo;					  // Objeto para gestionar el modo demo, en el que se ven pantallas del juego
	Ending *ending;				  // Objeto para gestionar el final del juego
	Ending2 *ending2;			  // Objeto para gestionar el final del juego
	GameOver *gameOver;			  // Objeto para gestionar el final de la partida
	Debug *debug;				  // Objeto para getsionar la información de debug
	struct options_t *options;	  // Variable con todas las opciones del programa
	section_t *section;			  // Sección y subsección actual del programa;

	// Variables
	JA_Music_t *music;			// Musica del titulo
	std::string executablePath; // Path del ejecutable
	std::string systemFolder;	// Carpeta del sistema donde guardar datos

	// Crea e inicializa las opciones del programa
	void initOptions();

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

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

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

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

	// Carga los recursos
	void loadResources(section_t *section);

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

	// Inicializa jail_audio
	void initJailAudio();

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

	// Inicializa el objeto Input
	void initInput();

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

	// Ejecuta la seccion de juego con el logo
	void runLogo();

	// Ejecuta la seccion de juego de la pantalla de carga
	void runLoadingScreen();

	// Ejecuta la seccion de juego con el titulo y los menus
	void runTitle();

	// Ejecuta la seccion de los creditos del juego
	void runCredits();

	// Ejecuta la seccion de la demo, donde se ven pantallas del juego
	void runDemo();

	// Ejecuta la seccion del final del juego
	void runEnding();

	// Ejecuta la seccion del final del juego
	void runEnding2();

	// Ejecuta la seccion del final de la partida
	void runGameOver();

	// Ejecuta la seccion de juego donde se juega
	void runGame();

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

	// Destructor
	~Director();

	// Bucle principal
	void run();
};