#pragma once

#include <SDL2/SDL_rect.h>	 // for SDL_Rect
#include <SDL2/SDL_render.h> // for SDL_Texture
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>			 // for shared_ptr
#include <string>			 // for string
#include <vector>			 // for vector
#include "paleta.h"			 // for jSurface
class SSprite;				 // lines 13-13
class Surface;				 // lines 15-15

class Title
{
private:
	struct TitleLetter
	{
		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 class TitleState
	{
		SHOW_LOADING_SCREEN,
		FADE_LOADING_SCREEN,
		SHOW_MENU
	};

	// Objetos y punteros
	std::shared_ptr<Surface> title_logo_surface_; // Textura con los graficos
	std::shared_ptr<SSprite> title_logo_sprite_;  // SSprite para manejar la surface
	std::shared_ptr<Surface> bg_surface_;		  // Textura para dibujar el fondo de la pantalla
	std::shared_ptr<Surface> cheevos_surface_;	  // Textura con la lista de logros
	std::shared_ptr<SSprite> cheevos_sprite_;	  // SSprite para manejar la surface 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
	std::vector<TitleLetter> 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_surface_view_;	   // Zona visible de la surface con el listado de logros
	TitleState 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();

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

	// Rellena la surface de fondo con todos los gráficos
	void fillSurface();

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

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

public:
	// Constructor
	Title();

	// Destructor
	~Title();

	// Bucle principal
	void run();
};