#pragma once

#include <SDL2/SDL.h>
#include "balloon.h"
#include "bullet.h"
#include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h"
#include "common/menu.h"
#include "common/movingsprite.h"
#include "common/screen.h"
#include "common/smartsprite.h"
#include "common/sprite.h"
#include "common/text.h"
#include "common/utils.h"
#include "common/writer.h"
#include "const.h"
#include "fade.h"
#include "game.h"
#include "intro.h"
#include "item.h"
#include "logo.h"
#include "player.h"
#include "title.h"

#ifndef DIRECTOR_H
#define DIRECTOR_H

// Textos
#define WINDOW_CAPTION "Coffee Crisis"

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
	Logo *logo;				// Objeto para la sección del logo
	Intro *intro;			// Objeto para la sección de la intro
	Title *title;			// Objeto para la sección del titulo y el menu de opciones
	Game *game;				// Objeto para la sección del juego
	Input *input;			// Objeto Input para gestionar las entradas
	Lang *lang;				// Objeto para gestionar los textos en diferentes idiomas
	Asset *asset;			// Objeto que gestiona todos los ficheros de recursos
	section_t *section;		// Sección y subsección actual del programa;

	// Variables
	struct options_t *options;	// Variable con todas las opciones del programa
	std::string executablePath; // Path del ejecutable
	std::string systemFolder;	// Carpeta del sistema donde guardar datos

	// Inicializa jail_audio
	void initJailAudio();

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

	// Inicializa el objeto input
	void initInput();

	// Inicializa los servicios online
	void initOnline();

	// Inicializa las opciones del programa
	void initOptions();

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

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

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

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

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

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

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

	// Destructor
	~Director();

	// Bucle principal
	void run();
};

#endif
