#pragma once

#include <SDL3/SDL_stdinc.h> // Para Uint32
#include <memory>			 // Para unique_ptr, shared_ptr
#include "section.h"		 // Para Options

class DefineButtons;
class Fade;
class GameLogo;
class Sprite;
class Text;
class TiledBG;

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

// Parámetros
constexpr bool ALLOW_TITLE_ANIMATION_SKIP = false;

/*
	Clase que gestiona el estado de título/menú principal del juego.
	Responsable de mostrar el logo, el fondo animado y gestionar la entrada para comenzar la partida.
	No permite saltar la animación del título salvo que se cambie el define.
*/

// Clase Title
class Title
{
public:
	// --- Constructores y destructor ---
	Title();
	~Title();

	// --- Método principal ---
	void run(); // Bucle para el título del juego

private:
	// --- Enumeraciones ---
	enum class TitleState
	{
		LOGO_ANIMATING,			// El logo está animándose
		LOGO_FINISHED,			// El logo ha terminado de animarse
		START_HAS_BEEN_PRESSED, // Se ha pulsado el botón de start
	};

	// --- Objetos y punteros ---
	std::shared_ptr<Text> text_;					// Objeto de texto para escribir en pantalla
	std::unique_ptr<Fade> fade_;					// Fundido en pantalla
	std::unique_ptr<TiledBG> tiled_bg_;				// Fondo animado de tiles
	std::unique_ptr<GameLogo> game_logo_;			// Logo del juego
	std::unique_ptr<Sprite> mini_logo_sprite_;		// Logo JailGames mini
	std::unique_ptr<DefineButtons> define_buttons_; // Definición de botones del joystick

	// --- Variables de estado ---
	int counter_ = 0;												// Temporizador para la pantalla de título
	Uint64 ticks_ = 0;												// Contador de ticks para ajustar la velocidad
	section::Name next_section_;									// Siguiente sección a cargar
	section::Options selection_ = section::Options::TITLE_TIME_OUT; // Opción elegida en el título
	int num_controllers_;											// Número de mandos conectados
	TitleState state_;												// Estado actual de la sección

	// --- Métodos internos ---
	void update();			// Actualiza las variables del objeto
	void render();			// Dibuja el objeto en pantalla
	void checkEvents();		// Comprueba los eventos
	void checkInput();		// Comprueba las entradas
	void resetCounter();	// Reinicia el contador interno
	void swapControllers(); // Intercambia la asignación de mandos a los jugadores
	void swapKeyboard();	// Intercambia el teclado de jugador
	void showControllers(); // Muestra información sobre los controles y los jugadores
	void updateFade();		// Actualiza el fade
	void updateState();		// Actualiza el estado
};