#pragma once

#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_video.h>	 // for SDL_Window
#include <string>			 // for string, basic_string
#include <vector>			 // for vector
#include "lang.h"			 // for lang_e
#include "utils.h"			 // for MusicFile, SoundFile

// Textos
#define WINDOW_CAPTION "Coffee Crisis Arcade Edition"

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

	// Variables
	std::string executablePath;	   // Path del ejecutable
	std::string systemFolder;	   // Carpeta del sistema donde guardar datos
	std::string paramFileArgument; // Argumento para gestionar el fichero con los parametros del programa
	std::vector<SoundFile> sounds; // Vector con los sonidos
	std::vector<MusicFile> musics; // Vector con las musicas

	// Inicializa jail_audio
	void initJailAudio();

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

	// Inicializa el objeto input
	void initInput();

	// Carga los parametros para configurar el juego
	void loadParams(std::string filepath);

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

	// Carga los sonidos del juego
	void loadSounds();

	// Carga las musicas del juego
	void loadMusics();

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

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

	// Ejecuta la sección con el logo
	void runLogo();

	// Ejecuta la sección con la secuencia de introducción
	void runIntro();

	// Ejecuta la sección con el titulo del juego
	void runTitle();

	// Ejecuta la sección donde se juega al juego
	void runGame();

	// Ejecuta la sección donde se muestran las instrucciones
	void runInstructions();

	// Ejecuta la sección donde se muestra la tabla de puntuaciones
	void runHiScoreTable();

	// Ejecuta el juego en modo demo
	void runDemoGame();

	// Obtiene una fichero a partir de un lang_e
	std::string getLangFile(lang::lang_e lang);

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

	// Destructor
	~Director();

	// Bucle principal
	int run();
};