#pragma once

#include <SDL2/SDL_events.h> // Para SDL_Event
#include <SDL2/SDL_render.h> // Para SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h> // Para Uint32
#include <string>			 // Para basic_string, string
#include <vector>			 // Para vector
#include "utils.h"			 // Para 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 color;	   // Color del texto
	};

	// 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
	Text *text_;				 // Objeto para escribir texto en pantalla
	SDL_Texture *text_texture_;	 // Textura para dibujar el texto
	SDL_Texture *cover_texture_; // Textura para cubrir el texto
	AnimatedSprite *sprite_;	 // Sprite para el brillo del corazón

	// Variables
	int counter_ = 0;				// Contador
	bool counter_enabled_ = true;	// Indica si esta activo el contador
	int sub_counter_ = 0;			// Contador secundario
	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
	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();

	// Destructor
	~Credits();

	// Bucle principal
	void run();
};
