#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
#include "utils.h"            // for color_t
class Asset;
class Input;
class Resource;
class Screen;
class Sprite;
class Texture;

class Logo
{
private:
	// Objetos y punteros
	SDL_Renderer *renderer;		  // El renderizador de la ventana
	Screen *screen;				  // Objeto encargado de dibujar en pantalla
	Resource *resource;			  // Objeto con los recursos
	Asset *asset;				  // Objeto con los ficheros de recursos
	Input *input;				  // Objeto pata gestionar la entrada
	Texture *texture;			  // Textura con los graficos "JAILGAMES"
	Texture *texture2;			  // Textura con los graficos "Since 1998"
	SDL_Event *eventHandler;	  // Manejador de eventos
	std::vector<Sprite *> sprite; // Vector con los sprites de cada linea que forman el bitmap JAILGAMES
	Sprite *sprite2;			  // Sprite para manejar la textura2
	options_t *options;			  // Puntero a las opciones del juego
	section_t *section;			  // Estado del bucle principal para saber si continua o se sale

	// Variables
	std::vector<color_t> 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 initFade;				// Tiempo del contador cuando inicia el fade a negro
	int endLogo;				// Tiempo del contador para terminar el logo
	int postLogo;				// 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();

	// Cambia la paleta
	void switchPalette();

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

public:
	// Constructor
	Logo(SDL_Renderer *renderer, Screen *screen, Resource *resource, Asset *asset, Input *input, options_t *options, section_t *section);

	// Destructor
	~Logo();

	// Bucle principal
	void run();
};