#pragma once

#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_video.h>	 // for SDL_Window
#include <string>			 // for string
class Asset;				 // lines 6-6
class Debug;				 // lines 8-8
class Input;				 // lines 14-14
class Resource;				 // lines 17-17
class Screen;				 // lines 18-18
struct JA_Music_t;			 // lines 20-20
struct Options;				 // lines 21-21
struct SectionState;		 // lines 22-22

class Director
{
private:
	// Objetos y punteros
	SDL_Window *window_;	 // La ventana donde dibujamos
	SDL_Renderer *renderer_; // El renderizador de la ventana

	// Variables
	JA_Music_t *title_music_;	  // Musica del titulo
	std::string executable_path_; // Path del ejecutable
	std::string system_folder_;	  // Carpeta del sistema donde guardar datos

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

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

	// Carga los recursos
	void loadResources(SectionState section);

	// 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, const char *argv[]);

	// Destructor
	~Director();

	// Bucle principal
	int run();
};