#pragma once

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

#ifndef DIRECTOR_H
#define DIRECTOR_H

// Textos
#define WINDOW_CAPTION "Coffee Crisis"

// Clase Director
class Director
{
private:
	// Objetos
	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

	// Variables
	struct options_t *options; // Variable con todas las opciones del programa
	section_t section;		   // Sección y subsección actual del programa;

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

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

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

	// 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
