#pragma once

#include <SDL2/SDL.h>
#include "common/asset.h"
#include "common/input.h"
#include "common/jail_audio.h"
#include "common/screen.h"
#include "common/sprite.h"
#include "common/text.h"
#include "common/utils.h"
#include "const.h"

#ifndef HISCORE_TABLE_H
#define HISCORE_TABLE_H

enum mode_hiScoreTable_e
{
	mhst_manual,
	mhst_auto
};

class HiScoreTable
{
private:
	// Objetos y punteros
	SDL_Renderer *renderer;	 // El renderizador de la ventana
	Screen *screen;			 // Objeto encargado de dibujar en pantalla
	SDL_Event *eventHandler; // Manejador de eventos
	SDL_Texture *backbuffer; // Textura para usar como backbuffer
	Asset *asset;			 // Objeto que gestiona todos los ficheros de recursos
	Input *input;			 // Objeto pata gestionar la entrada
	Lang *lang;				 // Objeto para gestionar los textos en diferentes idiomas
	Text *text;				 // Objeto para escribir texto
	options_t *options;		 // Opciones y parametyros del programa
	section_t *section;		 // Estado del bucle principal para saber si continua o se sale

	// 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
	bool manualQuit;		  // Indica si se quiere salir del modo manual
	mode_hiScoreTable_e mode; // Modo en el que se van a ejecutar las instrucciones

	// Actualiza las variables
	void update();

	// Pinta en pantalla
	void render();

	// Comprueba los eventos
	void checkEventHandler();

	// Comprueba las entradas
	void checkInput();

	// Transforma un valor numérico en una cadena de 6 cifras
	std::string scoreToString(Uint32 num);

public:
	// Constructor
	HiScoreTable(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Lang *lang, options_t *options, section_t *section);

	// Destructor
	~HiScoreTable();

	// Bucle principal
	void run(mode_hiScoreTable_e mode);
};

#endif
