#pragma once

#include <SDL3/SDL_rect.h>	 // Para SDL_FPoint
#include <SDL3/SDL_stdinc.h> // Para Uint64
#include <memory>			 // Para shared_ptr, unique_ptr
#include <vector>			 // Para vector

class Sprite;
class Texture;
struct Color;

/*
	Esta clase gestiona un estado del programa. Se encarga de dibujar por pantalla el
	logo de "JAILGAMES" utilizando un sencillo efecto consistente en generar un sprite por
	cada línea del bitmap que forma la palabra "JAILGAMES". Posteriormente realiza una
	modulación de color sobre la textura para simular un fade to black al estilo
	ZX Spectrum.
*/

// --- Clase Logo ---
class Logo
{
public:
	// Constructor
	Logo();

	// Destructor
	~Logo();

	// Bucle principal
	void run();

private:
	// --- Constantes ---
	static constexpr int SHOW_SINCE_SPRITE_COUNTER_MARK = 70; // Tiempo del contador en el que empieza a verse el sprite de "SINCE 1998"
	static constexpr int INIT_FADE_COUNTER_MARK = 300;		  // Tiempo del contador cuando inicia el fade a negro
	static constexpr int END_LOGO_COUNTER_MARK = 400;		  // Tiempo del contador para terminar el logo
	static constexpr int POST_LOGO_DURATION = 20;			  // Tiempo que dura el logo con el fade al máximo
	static constexpr int SPEED = 8;							  // Velocidad de desplazamiento de cada línea

	// --- Objetos y punteros ---
	std::shared_ptr<Texture> since_texture_;		   // Textura con los gráficos "Since 1998"
	std::unique_ptr<Sprite> since_sprite_;			   // Sprite para manejar la since_texture
	std::shared_ptr<Texture> jail_texture_;			   // Textura con los gráficos "JAILGAMES"
	std::vector<std::unique_ptr<Sprite>> jail_sprite_; // Vector con los sprites de cada línea que forman el bitmap JAILGAMES

	// --- Variables ---
	std::vector<Color> color_; // Vector con los colores para el fade
	int counter_ = 0;		   // Contador
	Uint64 ticks_ = 0;		   // Contador de ticks para ajustar la velocidad del programa
	SDL_FPoint dest_;		   // Posición donde dibujar el logo

	// --- Métodos internos ---
	void update();				// Actualiza las variables
	void render();				// Dibuja en pantalla
	void checkEvents();			// Comprueba el manejador de eventos
	void checkInput();			// Comprueba las entradas
	void updateJAILGAMES();		// Gestiona el logo de JAILGAMES
	void renderJAILGAMES();		// Renderiza el logo de JAILGAMES
	void updateTextureColors(); // Gestiona el color de las texturas
};
