#pragma once

#include <SDL2/SDL_events.h>  // for SDL_Event
#include <SDL2/SDL_render.h>  // for SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h>  // for Uint32
#include <string>             // for basic_string, string
#include <vector>             // for vector
#include "utils.h"            // for color_t
class AnimatedSprite;
class Asset;
class Input;
class Resource;
class Screen;
class Text;

class Credits
{
private:
	struct captions_t
	{
		std::string label; // Texto a escribir
		color_t color;	   // Color del texto
	};

	// 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
	SDL_Event *eventHandler;   // Manejador de eventos
	Text *text;				   // Objeto para escribir texto en pantalla
	SDL_Texture *textTexture;  // Textura para dibujar el texto
	SDL_Texture *coverTexture; // Textura para cubrir el texto
	AnimatedSprite *sprite;	   // Sprite para el brillo del corazón
	options_t *options;		   // Puntero a las opciones del juego
	section_t *section;		   // Estado del bucle principal para saber si continua o se sale

	// Variables
	int counter;				   // Contador
	bool counterEnabled;		   // Indica si esta activo el contador
	int subCounter;				   // Contador secundario
	Uint32 ticks;				   // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;			   // Velocidad a la que se repiten los bucles del programa
	std::vector<captions_t> texts; // Vector con los textos

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

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

	// Comprueba las entradas
	void checkInput();

	// Actualiza el contador
	void updateCounter();

	// Inicializa los textos
	void iniTexts();

	// Escribe el texto en la textura
	void fillTexture();

	// Cambia la paleta
	void switchPalette();

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

	// Destructor
	~Credits();

	// Bucle principal
	void run();
};
