#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_rect.h>	 // for SDL_Point
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <vector>			 // for vector
#include <memory>
#include "utils.h" // for Color
#include "sprite.h"
#include "texture.h"

/*
	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:
	// Objetos y punteros
	std::shared_ptr<Texture> sinceTexture;			 // Textura con los graficos "Since 1998"
	std::unique_ptr<Sprite> sinceSprite;			 // Sprite para manejar la sinceTexture
	std::shared_ptr<Texture> jailTexture;			 // Textura con los graficos "JAILGAMES"
	std::vector<std::unique_ptr<Sprite>> jailSprite; // 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
	Uint32 ticksSpeed;		  // Velocidad a la que se repiten los bucles del programa
	int showSinceSprite_cm;	  // Tiempo del contador en el que empieza a verse el sprite de "SINCE 1998"
	int initFade_cm;		  // Tiempo del contador cuando inicia el fade a negro
	int endLogo_cm;			  // Tiempo del contador para terminar el logo
	int postLogoDuration;	  // Tiempo que dura el logo con el fade al maximo
	int speed;				  // Velocidad de desplazamiento de cada linea
	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() = default;

	// Bucle principal
	void run();
};
