#pragma once

#include <SDL2/SDL.h>
#include "common/animatedsprite.h"
#include "common/asset.h"
#include "common/debug.h"
#include "common/input.h"
#include "common/resource.h"
#include "common/screen.h"
#include "common/sprite.h"
#include "common/text.h"
#include "common/utils.h"
#include "const.h"
#include "item_tracker.h"
#include "room_tracker.h"
#include "room.h"
#include "scoreboard.h"

#ifndef DEMO_H
#define DEMO_H

class Demo
{
private:
	// Objetos y punteros
	SDL_Renderer *renderer;	  // El renderizador de la ventana
	SDL_Event *eventHandler;  // Manejador de eventos
	Screen *screen;			  // Objeto encargado de manejar el renderizador
	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
	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
	options_t *options;		  // Puntero a las opciones del juego

	// Variables
	Uint32 ticks;					// Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;				// Velocidad a la que se repiten los bucles del programa
	section_t section;				// Seccion actual dentro del juego
	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 checkEventHandler();

	// 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(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, options_t *options, Debug *debug);

	// Destructor
	~Demo();

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

#endif
