#pragma once

#include <SDL2/SDL_render.h> // Para SDL_Renderer
#include <SDL2/SDL_video.h>	 // Para SDL_Window
#include <string>			 // Para string
namespace lang
{
	enum class Code : int;
} // lines 9-9

// Textos
constexpr char 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
#ifndef VERBOSE
	std::streambuf *orig_buf; // Puntero al buffer de flujo original para restaurar std::cout
#endif

	// Variables
	std::string executable_path_; // Path del ejecutable
	std::string system_folder_;	  // Carpeta del sistema donde guardar datos

	// Inicializa jail_audio
	void initJailAudio();

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

	// Asigna los botones y teclas al objeto Input
	void bindInputs();

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

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

	// Crea la carpeta del sistema donde guardar datos
	void createSystemFolder(const 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::Code
	std::string getLangFile(lang::Code code);
#ifdef ARCADE
	// Apaga el sistema
	void shutdownSystem();
#endif

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

	// Destructor
	~Director();

	// Bucle principal
	int run();
};