#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_rect.h>	 // for SDL_Rect
#include <SDL2/SDL_render.h> // for SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h> // for Uint16, Uint32
#include <memory>
#include <string> // for string
#include "fade.h"
#include "section.h" // for options_e
#include "background.h"
#include "text.h"

struct JA_Music_t;

/*
	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:
	// Objetos y punteros
	SDL_Renderer *renderer;	 // El renderizador de la ventana
	SDL_Texture *backbuffer; // Textura para usar como backbuffer
	JA_Music_t *music;		 // Musica de fondo
	
	std::unique_ptr<Fade> fade;				 // Objeto para renderizar fades
	std::unique_ptr<Background> background;	 // Objeto para dibujar el fondo del juego
	std::unique_ptr<SDL_Event> eventHandler; // Manejador de eventos
	std::unique_ptr<Text> text;				 // Objeto para escribir texto

	// Variables
	Uint16 counter;	   // Contador
	Uint16 counterEnd; // Valor final para el contador
	Uint32 ticks;	   // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed; // Velocidad a la que se repiten los bucles del programa
	SDL_Rect viewArea; // Parte de la textura que se muestra en pantalla
	FadeMode fadeMode; // 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(JA_Music_t *music);

	// Destructor
	~HiScoreTable();

	// Bucle principal
	void run();
};