#pragma once

#include <SDL2/SDL_events.h> // Para SDL_Event
#include <SDL2/SDL_render.h> // Para SDL_Renderer
#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <string>			 // Para string, basic_string
#include <vector>			 // Para vector
#include "scoreboard.h"		 // Para board_t
class Asset;
class Debug;
class Input;
class ItemTracker;
class Resource;
class Room;
class Screen;
class Text;
struct Options;
struct SectionState;

class Demo
{
private:
	// Objetos y punteros
	Screen *screen;			  // Objeto encargado de manejar el renderizador
	SDL_Renderer *renderer;	  // El renderizador de la ventana
	Room *room;				  // Objeto encargado de gestionar cada habitación del juego
	Resource *resource;		  // Objeto con los recursos
	Asset *asset;			  // Objeto con la ruta a todos los ficheros de recursos
	Input *input;			  // Objeto pata gestionar la entrada
	Text *text;				  // Objeto para los textos del juego
	Scoreboard *scoreboard;	  // Objeto encargado de gestionar el marcador
	ItemTracker *itemTracker; // Lleva el control de los objetos recogidos
	Debug *debug;			  // Objeto para gestionar la información de debug

	// Variables
	Uint32 ticks;					// Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;				// Velocidad a la que se repiten los bucles del programa
	std::string currentRoom;		// Fichero de la habitación actual
	board_t board;					// Estructura con los datos del marcador
	int counter;					// Contador para el modo demo
	int roomTime;					// Tiempo que se muestra cada habitacion
	int roomIndex;					// Indice para el vector de habitaciones
	std::vector<std::string> rooms; // Listado con los mapas de la demo

	// Actualiza el juego, las variables, comprueba la entrada, etc.
	void update();

	// Pinta los objetos en pantalla
	void render();

	// Comprueba los eventos de la cola
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Escribe el nombre de la pantalla
	void renderRoomName();

	// Recarga todas las texturas
	void reLoadTextures();

	// Cambia la paleta
	void switchPalette();

	// Cambia de habitación
	bool changeRoom(std::string file);

	// Comprueba si se ha de cambiar de habitación
	void checkRoomChange();

	// Pone el color del marcador en función del color del borde de la habitación
	void setScoreBoardColor();

public:
	// Constructor
	Demo();

	// Destructor
	~Demo();

	// Bucle para el juego
	void run();
};
