#pragma once

#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>			 // for shared_ptr
#include <string>			 // for string
#include <vector>			 // for vector
#include "scoreboard.h"		 // for board_t
class Asset;				 // lines 11-11
class Debug;				 // lines 12-12
class Input;				 // lines 13-13
class ItemTracker;			 // lines 14-14
class Resource;				 // lines 15-15
class Room;					 // lines 16-16
class Screen;				 // lines 17-17
class Text;					 // lines 18-18

class Demo
{
private:
	// Objetos y punteros
	std::shared_ptr<Room> room_;			 // Objeto encargado de gestionar cada habitación del juego
	std::shared_ptr<Scoreboard> scoreboard_; // Objeto encargado de gestionar el marcador

	// Variables
	Uint32 ticks_;							// Contador de ticks para ajustar la velocidad del programa
	std::string current_room_;				// Fichero de la habitación actual
	std::shared_ptr<ScoreboardData> board_; // Estructura con los datos del marcador
	int counter_;							// Contador para el modo demo
	int room_time_;							// Tiempo que se muestra cada habitacion
	int room_index_;						// 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();

	// Cambia de habitación
	bool changeRoom(const 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();
};
