#pragma once

#include <SDL2/SDL.h>
#include "common/asset.h"
#include "common/const.h"
#include "common/debug.h"
#include "common/input.h"
#include "common/jail_audio.h"
#include "common/screen.h"
#include "common/utils.h"
#include "game.h"
#include "intro.h"
#include "logo.h"
#include "title.h"
#include <string>

#ifndef PROG_H
#define PROG_H

// Textos
#define WINDOW_CAPTION "Volcano"

class Director
{
private:
	SDL_Window *window;		   // La ventana donde dibujamos
	SDL_Renderer *renderer;	   // El renderizador de la ventana
	Asset *asset;			   // Objeto encargado de gestionar los ficheros de recursos
	Screen *screen;			   // Objeto encargado de dibujar en pantalla
	Input *input;			   // Objeto Input para gestionar las entradas
	Game *game;				   // Objeto para la sección del juego
	Intro *intro;			   // Objeto encargado de gestionar la intro del juego
	Logo *logo;				   // Objeto encargado de gestionar el logo del juego
	Title *title;			   // Objeto encargado de gestionar el titulo del juego, con el menu principal
	Debug *debug;			   // Objeto para getsionar la información de debug
	section_t section;		   // Sección y subsección actual del programa;
	struct options_t *options; // Contiene las opciones del programa

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

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

	// 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();

	// Obtiene el valor de la variable
	Uint8 getSubsection();

	// Obtiene el valor de la variable
	Uint8 getSection();

	// Establece el valor de la variable
	void setSection(section_t section);

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

	// Ejecuta la seccion de juego de la introducción
	void runIntro();

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

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

public:
	// Constructor
	Director(std::string path);

	// Destructor
	~Director();

	// Bucle principal
	void run();
};

#endif
