#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 Uint32
#include <string>             // for basic_string, string
#include <vector>             // for vector
#include "paleta.h"           // for jSurface
class Asset;
class Cheevos;
class Input;
class Resource;
class Screen;
class Sprite;
class Text;
class Texture;
struct options_t;
struct section_t;

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
	SDL_Renderer *renderer;	 // El renderizador de la ventana
	Screen *screen;			 // Objeto encargado de dibujar en pantalla
	Resource *resource;		 // Objeto con los recursos
	Asset *asset;			 // Objeto con los ficheros de recursos
	Input *input;			 // Objeto pata gestionar la entrada
	SDL_Event *eventHandler; // Manejador de eventos
	Texture *texture;		 // Textura con los graficos
	Sprite *sprite;			 // Sprite para manejar la textura
	SDL_Texture *bgTexture;	 // Textura para dibujar el fondo de la pantalla
	Text *text;				 // Objeto para escribir texto en pantalla
	Text *infoText;			 // Objeto para escribir texto en pantalla
	options_t *options;		 // Puntero a las opciones del juego
	Texture *cheevosTexture; // Textura con lo lista de logros
	Sprite *cheevosSprite;	 // Sprite para manejar la textura con la lista de logros
	Cheevos *cheevos;		 // Objeto encargado de gestionar los logros del juego
	section_t *section;		 // Estado del bucle principal para saber si continua o se sale

	// Variables
	int counter;				   // Contador
	std::string longText;		   // Texto que aparece en la parte inferior del titulo
	Uint32 ticks;				   // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;			   // Velocidad a la que se repiten los bucles del programa
	std::vector<letter_t> letters; // Vector con las letras de la marquesina
	int marqueeSpeed;			   // Velocidad de desplazamiento de la marquesina
	bool showCheevos;			   // Indica si se muestra por pantalla el listado de logros
	SDL_Rect cheevosTextureView;   // 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(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);

	// Destructor
	~Title();

	// Bucle principal
	void run();
};