#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
#include <memory>			 // Para shared_ptr
class AnimatedSprite;
class Asset;
class Resource;
class Text;
class Texture;

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

	// Constructor por defecto
	ScoreboardData()
		: items(0), lives(0), rooms(0), music(true), color({0, 0, 0}), ini_clock(0), jail_is_open(false) {}

	// Constructor parametrizado
	ScoreboardData(int items, int lives, int rooms, bool music, Color color, Uint32 ini_clock, bool jail_is_open)
		: items(items), lives(lives), rooms(rooms), music(music), color(color), ini_clock(ini_clock), jail_is_open(jail_is_open) {}
};

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

		// Constructor por defecto
		ClockData()
			: hours(0), minutes(0), seconds(0), separator(":") {}

		// Constructor parametrizado
		ClockData(int h, int m, int s, const std::string &sep)
			: hours(h), minutes(m), seconds(s), separator(sep) {}
	};

	// Objetos y punteros
	std::shared_ptr<AnimatedSprite> player_sprite_; // Sprite para mostrar las vidas en el marcador
	std::shared_ptr<Texture> item_texture_;			// Textura con los graficos para las vidas
	std::shared_ptr<ScoreboardData> data_;			// Contiene las variables a mostrar en el marcador
	SDL_Texture *texture_;							// Textura donde dibujar el marcador;

	// Variables
	std::vector<Color> color_;	 // Vector con los colores del objeto
	int counter_;				 // Contador interno
	int change_color_speed_;	 // Cuanto mas alto, mas tarda en cambiar de color
	bool is_paused_;			 // Indica si el marcador esta en modo pausa
	Uint32 paused_time_;		 // Milisegundos que ha estado el marcador en pausa
	Uint32 paused_time_elapsed_; // Tiempo acumulado en pausa
	ClockData clock_;			 // Contiene las horas, minutos y segundos transcurridos desde el inicio de la partida
	Color items_color_;			 // Color de la cantidad de items recogidos
	SDL_Rect texture_dest_;		 // Rectangulo donde dibujar la textura del marcador

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

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

	// Dibuja los elementos del marcador en la textura
	void fillTexture();

public:
	// Constructor
	explicit Scoreboard(std::shared_ptr<ScoreboardData> data);

	// Destructor
	~Scoreboard();

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

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

	// Pone el marcador en modo pausa
	void setPaused(bool value);

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