#pragma once

#include <SDL2/SDL_rect.h>	 // para SDL_Point
#include <SDL2/SDL_stdinc.h> // para Uint32
#include <memory>			 // para unique_ptr, shared_ptr
#include <vector>			 // para vector
#include "sprite.h"			 // para Sprite
#include "utils.h"			 // para Color
class Texture;

/*
	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 linea 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
{
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 maximo
	static constexpr int SPEED = 8;							  // Velocidad de desplazamiento de cada linea

	// Objetos y punteros
	std::shared_ptr<Texture> since_texture_;		   // Textura con los graficos "Since 1998"
	std::unique_ptr<Sprite> since_sprite_;			   // Sprite para manejar la sinceTexture
	std::shared_ptr<Texture> jail_texture_;			   // Textura con los graficos "JAILGAMES"
	std::vector<std::unique_ptr<Sprite>> jail_sprite_; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES

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

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

	// Comprueba el manejador de eventos
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Gestiona el logo de JAILGAME
	void updateJAILGAMES();

	// Gestiona el color de las texturas
	void updateTextureColors();

	// Recarga todas las texturas
	void reloadTextures();

public:
	// Constructor
	Logo();

	// Destructor
	~Logo();

	// Bucle principal
	void run();
};
