#pragma once

#include <SDL3/SDL_rect.h>	 // Para SDL_FRect
#include <SDL3/SDL_render.h> // Para SDL_Renderer, SDL_Texture
#include <SDL3/SDL_stdinc.h> // Para Uint16, Uint32, Uint8
#include <memory>			 // Para unique_ptr, shared_ptr
#include <string>			 // Para string
#include <vector>			 // Para vector
#include "utils.h"

class Background;
class Fade;
class PathSprite;
class Sprite;
enum class FadeMode : Uint8;
struct Path;

/*
	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 puntuaciones. 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
{
public:
	// Constructor
	HiScoreTable();

	// Destructor
	~HiScoreTable();

	// Bucle principal
	void run();

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<Sprite> header_;					   // Sprite con la cabecera del texto
	std::vector<std::shared_ptr<PathSprite>> entry_names_; // Lista con los sprites de cada uno de los nombres de la tabla de records
	std::vector<Path> paths_;							   // Vector con los recorridos precalculados

	// --- Variables ---
	Uint16 counter_ = 0;			  // Contador
	Uint64 ticks_;					  // Contador de ticks para ajustar la velocidad del programa
	SDL_FRect view_area_;			  // Parte de la textura que se muestra en pantalla
	FadeMode fade_mode_;			  // Modo de fade a utilizar
	Color background_fade_color_;	  // Color de atenuación del fondo
	std::vector<Color> entry_colors_; // Colores para destacar las entradas en la tabla

	// --- Métodos internos ---
	void update();					   // Actualiza las variables
	void render();					   // Pinta en pantalla
	void checkEvents();				   // Comprueba los eventos
	void checkInput();				   // Comprueba las entradas
	std::string format(int number);	   // Convierte un entero a un string con separadores de miles
	void fillTexture();				   // Dibuja los sprites en la textura
	void updateFade();				   // Gestiona el fade
	void createSprites();			   // Crea los sprites con los textos
	void updateSprites();			   // Actualiza las posiciones de los sprites de texto
	void initFade();				   // Inicializa el fade
	void initBackground();			   // Inicializa el fondo
	Color getEntryColor(int counter_); // Obtiene un color del vector de colores de entradas
	void iniEntryColors();			   // Inicializa los colores de las entradas
	void glowEntryNames();			   // Hace brillar los nombres de la tabla de records
	void updateCounter();			   // Gestiona el contador
};