#pragma once

#include <SDL2/SDL_render.h> // Para SDL_Renderer
#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <string>			 // Para basic_string, string
#include <vector>			 // Para vector
#include "utils.h"			 // Para color_t
class AnimatedSprite;
class Asset;
class Resource;
class Text;
class Texture;

struct board_t
{
	int items;		   // Lleva la cuenta de los objetos recogidos
	int lives;		   // Lleva la cuenta de ls vidas restantes del jugador
	int rooms;		   // Lleva la cuenta de las habitaciones visitadas
	bool music;		   // Indica si ha de sonar la musica durante el juego
	Color color;	   // Color para escribir el texto del marcador
	Uint32 iniClock;   // Tiempo inicial para calcular el tiempo transcurrido
	bool jail_is_open; // Indica si se puede entrar a la Jail
};

class Scoreboard
{
private:
	struct clock_t
	{
		int hours;
		int minutes;
		int seconds;
		std::string separator;
	};

	// Objetos y punteros
	AnimatedSprite *sprite; // Sprite para mostrar las vidas en el marcador
	SDL_Renderer *renderer; // El renderizador de la ventana
	Resource *resource;		// Objeto con los recursos
	Asset *asset;			// Objeto con la ruta a todos los ficheros de recursos
	Text *text;				// Objeto para escribir texto
	Texture *itemTexture;	// Textura con los graficos para las vidas
	board_t *board;			// Contiene las variables a mostrar en el marcador

	// Variables
	std::vector<Color> color; // Vector con los colores del objeto
	int counter;			  // Contador interno
	int colorChangeSpeed;	  // Cuanto mas alto, mas tarda en cambiar de color
	bool paused;			  // Indica si el marcador esta en modo pausa
	Uint32 timePaused;		  // Milisegundos que ha estado el marcador en pausa
	Uint32 totalTimePaused;	  // Tiempo acumulado en pausa
	clock_t clock;			  // Contiene las horas, minutos y segundos transcurridos desde el inicio de la partida
	Color itemsColor;		  // Color de la cantidad de items recogidos

	// Obtiene el tiempo transcurrido de partida
	clock_t getTime();

	// Actualiza el color de la cantidad de items recogidos
	void updateItemsColor();

public:
	// Constructor
	Scoreboard(board_t *board);

	// Destructor
	~Scoreboard();

	// Pinta el objeto en pantalla
	void render();

	// Actualiza las variables del objeto
	void update();

	// Recarga la textura
	void reLoadTexture();

	// Recarga la paleta
	void reLoadPalette();

	// Pone el marcador en modo pausa
	void pause();

	// Quita el modo pausa del marcador
	void resume();

	// Devuelve la cantidad de minutos de juego transcurridos
	int getMinutes();
};
