#pragma once

#include <SDL2/SDL_rect.h>	 // para SDL_Rect
#include <SDL2/SDL_render.h> // para SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h> // para Uint16, Uint32, Uint8
#include <memory>			 // para unique_ptr
#include <string>			 // para string
class Background;			 // lines 8-8
class Fade;					 // lines 9-9
class Text;					 // lines 10-10
enum class FadeMode : Uint8; // lines 11-11

/*
	Esta clase gestiona un estado del programa. Se encarga de mostrar la tabla con las puntuaciones
	más altas. Para ello utiliza un objeto que se encarga de pintar el fondo y una textura
	sobre la que escribe las puntuacions. Esta textura se recorre modificando la ventana de vista
	para dar el efecto de que la textura se mueve sobre la pantalla.

	Para mejorar la legibilidad de los textos, el objeto que dibuja el fondo es capaz de modificar
	su atenuación.
*/

// Clase HiScoreTable
class HiScoreTable
{
private:
	// Constantes
	static constexpr Uint16 COUNTER_END_ = 800; // Valor final para el contador

	// Objetos y punteros
	SDL_Renderer *renderer_;  // El renderizador de la ventana
	SDL_Texture *backbuffer_; // Textura para usar como backbuffer

	std::unique_ptr<Fade> fade_;			 // Objeto para renderizar fades
	std::unique_ptr<Background> background_; // Objeto para dibujar el fondo del juego
	std::unique_ptr<Text> text_;			 // Objeto para escribir texto

	// Variables
	Uint16 counter_;	 // Contador
	Uint32 ticks_;		 // Contador de ticks para ajustar la velocidad del programa
	SDL_Rect view_area_; // Parte de la textura que se muestra en pantalla
	FadeMode fade_mode_; // Modo de fade a utilizar

	// Actualiza las variables
	void update();

	// Pinta en pantalla
	void render();

	// Comprueba los eventos
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Convierte un entero a un string con separadores de miles
	std::string format(int number);

	// Crea el contenido de la textura con la lista de puntuaciones
	void fillTexture();

	// Recarga todas las texturas
	void reloadTextures();

	// Gestiona el fade
	void updateFade();

public:
	// Constructor
	HiScoreTable();

	// Destructor
	~HiScoreTable();

	// Bucle principal
	void run();
};