#pragma once

#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <memory>			 // Para unique_ptr, shared_ptr
#include "section.h"		 // Para Name
class DefineButtons;
class Fade;
class GameLogo;
class Sprite;
class Text;
class Texture; // lines 14-14
class TiledBG;

// Textos
constexpr const char TEXT_COPYRIGHT[] = "@2020,2024 JailDesigner";

// Parámetros
constexpr bool ALLOW_TITLE_ANIMATION_SKIP = true;

/*
	Esta clase gestiona un estado del programa. Se encarga de la parte del titulo o menu
	que sirve para empezar a jugar. Utiliza otras clases para:
		- Mostrar el logo del juego
		- Dibujar el tileado de fondo
		- Redifinir los botones de los mandos de juego

	Esta clase tiene dos estados:
		- El titulo está animandose, con el fondo estático
		- El titulo ya está en su sitio y el fondo se está animando

	Por razones de diseño, no se permite saltarse la animación del titulo, aunque es
	configurable mediante un define
*/

// Clase Title
class Title
{
private:
	// Objetos y punteros
	std::unique_ptr<Text> text1_;					// Objeto de texto para poder escribir textos en pantalla
	std::unique_ptr<Text> text2_;					// Objeto de texto para poder escribir textos en pantalla
	std::unique_ptr<Fade> fade_;					// Objeto para realizar fundidos en pantalla
	std::unique_ptr<TiledBG> tiled_bg_;				// Objeto para dibujar el mosaico animado de fondo
	std::unique_ptr<GameLogo> game_logo_;			// Objeto para dibujar el logo con el título del juego
	std::shared_ptr<Texture> mini_logo_texture_;	// Textura con el logo de JailGames mini
	std::unique_ptr<Sprite> mini_logo_sprite_;		// Sprite con el logo de JailGames mini
	std::unique_ptr<DefineButtons> define_buttons_; // Objeto para definir los botones del joystic

	// Variable
	int counter_ = 0;			 // Temporizador para la pantalla de titulo
	Uint32 ticks_ = 0;			 // Contador de ticks para ajustar la velocidad del programa
	section::Name next_section_; // Indica cual es la siguiente sección a cargar cuando termine el contador del titulo
	int post_fade_ = 0;			 // Opción a realizar cuando termina el fundido
	int num_controllers_;		 // Número de mandos conectados

	// Actualiza las variables del objeto
	void update();

	// Dibuja el objeto en pantalla
	void render();

	// Comprueba los eventos
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Recarga las texturas
	void reLoadTextures();

	// Reinicia el contador interno
	void resetCounter();

	// Intercambia la asignación de mandos a los jugadores
	void swapControllers();

	// Intercambia el teclado de jugador
	void swapKeyboard();

	// Muestra información sobre los controles y los jugadores
	void showControllers();

public:
	// Constructor
	Title();

	// Destructor
	~Title();

	// Bucle para el titulo del juego
	void run();
};