#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <vector>			 // for vector
class Asset;				 // lines 8-8
class Input;				 // lines 9-9
class Resource;				 // lines 10-10
class Screen;				 // lines 11-11
class Sprite;				 // lines 12-12
class Texture;				 // lines 13-13
struct Color;
struct Options;
struct SectionState;

class Logo
{
private:
	// Objetos y punteros
	Screen *screen_;						 // Objeto encargado de dibujar en pantalla
	SDL_Renderer *renderer_;				 // El renderizador de la ventana
	Resource *resource_;					 // Objeto con los recursos
	Asset *asset_;							 // Objeto con los ficheros de recursos
	Input *input_;							 // Objeto pata gestionar la entrada
	Texture *jailgames_texture_;			 // Textura con los graficos "JAILGAMES"
	Texture *since_1998_texture_;			 // Textura con los graficos "Since 1998"
	std::vector<Sprite *> jailgames_sprite_; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES
	Sprite *since_1998_sprite_;				 // Sprite para manejar la textura2

	// Variables
	std::vector<Color> color_; // Vector con los colores para el fade
	int counter_ = 0;		   // Contador
	Uint32 ticks_ = 0;		   // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticks_speed_ = 15;  // Velocidad a la que se repiten los bucles del programa
	int init_fade_ = 300;	   // Tiempo del contador cuando inicia el fade a negro
	int end_logo_ = 400;	   // Tiempo del contador para terminar el logo
	int post_logo_ = 20;	   // Tiempo que dura el logo con el fade al maximo

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

	// Termina la sección
	void endSection();

public:
	// Constructor
	Logo();

	// Destructor
	~Logo();

	// Bucle principal
	void run();
};