#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>
#include "define_buttons.h"
#include "fade.h"
#include "game_logo.h"
#include "text.h"
#include "tiled_bg.h"
#include "utils.h" // for Section
#include "sprite.h"
#include "texture.h"

class Asset;
class Input;
class Screen;
class Sprite;
class Texture;
struct JA_Music_t;

// 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
	Screen *screen;								  // Objeto encargado de dibujar en pantalla
	Asset *asset;								  // Objeto que gestiona todos los ficheros de recursos
	Input *input;								  // Objeto para leer las entradas de teclado o mando
	std::unique_ptr<SDL_Event> eventHandler;	  // Manejador de eventos
	std::unique_ptr<Tiledbg> tiledbg;			  // Objeto para dibujar el mosaico animado de fondo
	std::unique_ptr<GameLogo> gameLogo;			  // Objeto para dibujar el logo con el título del juego
	std::unique_ptr<DefineButtons> defineButtons; // Objeto para definir los botones del joystic
	std::shared_ptr<Texture> miniLogoTexture;	  // Textura con el logo de JailGames mini
	std::unique_ptr<Sprite> miniLogoSprite;		  // Sprite con el logo de JailGames mini

	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

	JA_Music_t *music; // Musica para el titulo

	// Variable
	int counter;		 // Temporizador para la pantalla de titulo
	Uint32 ticks;		 // Contador de ticks para ajustar la velocidad del programa
	bool demo;			 // Indica si el modo demo estará activo
	Section nextSection; // Indica cual es la siguiente sección a cargar cuando termine el contador del titulo
	Uint32 ticksSpeed;	 // Velocidad a la que se repiten los bucles del programa
	int postFade;		 // Opción a realizar cuando termina el fundido
	int numControllers;	 // Número de mandos conectados

	// Inicializa los valores de las variables
	void init();

	// 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();

public:
	// Constructor
	Title(JA_Music_t *music);

	// Destructor
	~Title() = default;

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