#pragma once
#include <SDL2/SDL.h>
#include "sprite.h"
#include "movingsprite.h"
#include "text.h"
#include "jail_audio.h"
#include "utils.h"
#include "input.h"
#include "game.h"
#include "logo.h"
#include "title.h"
#include "intro.h"
#include "asset.h"
#include "debug.h"
#include "const.h"

#ifndef DIRECTOR_H
#define DIRECTOR_H

// Director
class Director
{
private:
	SDL_Window *window;		// La ventana donde dibujamos
	SDL_Renderer *renderer; // El renderizador de la ventana
	Screen *screen;			// Objeto encargado de dibujar en pantalla
	Input *input;			// Objeto Input para gestionar las entradas
	Game *game;				// Objeto para gestionar la sección del juego
	Logo *logo;				// Objeto para gestionar la sección del logo del programa
	Title *title;			// Objeto para gestionar la pantalla de título
	Intro *intro;			// Onjeto para gestionar la introducción del juego
	Asset *asset;			// Objeto que gestiona todos los ficheros de recursos
	Debug *debug;			// Objeto para getsionar la información de debug

	struct options_t *options; // Variable con todas las opciones del programa

	std::string executablePath; // Path del ejecutable
	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();

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