#pragma once

#include <SDL2/SDL_events.h> // Para SDL_Event
#include <SDL2/SDL_rect.h>	 // Para SDL_Rect
#include <SDL2/SDL_render.h> // Para SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <string>			 // Para basic_string, string
#include <vector>			 // Para vector
#include <memory>
#include "paleta.h" // Para jSurface
class Asset;
class Cheevos;
class Input;
class Resource;
class Screen;
class Sprite;
class Text;
class Texture;
struct Options;
struct SectionState;

class Title
{
private:
	struct letter_t
	{
		std::string letter; // Letra a escribir
		int x;				// Posición en el eje x
		bool enabled;		// Solo se escriben y mueven si estan habilitadas
	};

	enum states_e
	{
		show_loading_screen,
		fade_loading_screen,
		show_menu
	};

	// Objetos y punteros
	Screen *screen_;		   // Objeto encargado de dibujar en pantalla
	SDL_Renderer *renderer_;   // El renderizador de la ventana
	Resource *resource_;	   // Objeto con los recursos
	Input *input_;			   // Objeto pata gestionar la entrada
	Texture *texture_;		   // Textura con los graficos
	Sprite *sprite_;		   // Sprite para manejar la textura
	SDL_Texture *bg_texture_;  // Textura para dibujar el fondo de la pantalla
	Text *text_;			   // Objeto para escribir texto en pantalla
	Text *info_text_;		   // Objeto para escribir texto en pantalla
	Texture *cheevos_texture_; // Textura con la lista de logros
	Sprite *cheevos_sprite_;   // Sprite para manejar la textura con la lista de logros

	// Variables
	int counter_ = 0;				// Contador
	std::string long_text_;			// Texto que aparece en la parte inferior del titulo
	Uint32 ticks_ = 0;				// Contador de ticks para ajustar la velocidad del programa
	Uint32 ticks_speed_ = 15;		// Velocidad a la que se repiten los bucles del programa
	std::vector<letter_t> letters_; // Vector con las letras de la marquesina
	int marquee_speed_ = 3;			// Velocidad de desplazamiento de la marquesina
	bool show_cheevos_ = false;		// Indica si se muestra por pantalla el listado de logros
	SDL_Rect cheevos_texture_view_; // Zona visible de la textura con el listado de logros
	states_e state_;				// Estado en el que se encuentra el bucle principal
	jSurface loading_screen_;		// Surface con los gráficos de la pantalla de carga

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

	// Comprueba el manejador de eventos
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Inicializa la marquesina
	void initMarquee();

	// Actualiza la marquesina
	void updateMarquee();

	// Dibuja la marquesina
	void renderMarquee();

	// Dibuja la linea de información inferior
	void renderInfo();

	// Recarga las texturas
	void reLoadTextures();

	// Cambia la paleta
	void switchPalette();

	// Desplaza la lista de logros
	void moveCheevosList(int direction);

	// Rellena la textura de fondo con todos los gráficos
	void fillTexture();

	// Crea y rellena la textura para mostrar los logros
	void createCheevosTexture();

	// Oculta la lista de logros
	void hideCheevosList();

public:
	// Constructor
	Title();

	// Destructor
	~Title();

	// Bucle principal
	void run();
};