#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
class Asset;
class Input;
class Resource;
class Screen;
class Sprite;
class Text;
class Texture;
struct JA_Music_t;
struct Options;
struct SectionState;

class Ending
{
private:
	// Estructuras
	struct endingTexture_t // Estructura con dos texturas y sprites, uno para mostrar y el otro hace de cortinilla
	{
		Texture *texture;	   // Textura a mostrar
		Sprite *sprite;		   // Sprite para mostrar la textura
		Texture *coverTexture; // Textura que cubre a la otra textura
		Sprite *coverSprite;   // Sprite para mostrar la textura que cubre a la otra textura
		int clipDesp;		   // Desplazamiento del spriteClip de la textura de cobertura
		int clipHeight;		   // Altura del spriteClip de la textura de cobertura
	};

	struct textAndPos_t // Estructura con un texto y su posición en el eje Y
	{
		std::string caption; // Texto
		int pos;			 // Posición
	};

	struct asdhk
	{
		int index;
		int trigger;
	};

	struct scene_t // Estructura para crear cada una de las escenas del final
	{
		std::vector<asdhk> textIndex; // Indices del vector de textos a mostrar y su disparador
		int pictureIndex;			  // Indice del vector de imagenes a mostrar
		int counterEnd;				  // Valor del contador en el que finaliza la escena
	};

	// 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 *coverTexture; // Textura para cubrir el texto

	// Variables
	int counter;							  // Contador
	int preCounter;							  // Contador previo
	int coverCounter;						  // Contador para la cortinilla
	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<endingTexture_t> spriteTexts; // Vector con los sprites de texto con su cortinilla
	std::vector<endingTexture_t> spritePics;  // Vector con los sprites de texto con su cortinilla
	int scene;								  // Escena actual
	std::vector<scene_t> scenes;			  // Vector con los textos e imagenes de cada escena
	JA_Music_t *music;						  // Musica que suena durante el final

	// Actualiza el objeto
	void update();

	// Dibuja el final en pantalla
	void render();

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

	// Comprueba las entradas
	void checkInput();

	// Inicializa los textos
	void iniTexts();

	// Inicializa las imagenes
	void iniPics();

	// Inicializa las escenas
	void iniScenes();

	// Actualiza los contadores
	void updateCounters();

	// Actualiza las cortinillas de los elementos
	void updateSpriteCovers();

	// Comprueba si se ha de cambiar de escena
	void checkChangeScene();

	// Rellena la textura para la cortinilla
	void fillCoverTexture();

	// Dibuja la cortinilla de cambio de escena
	void renderCoverTexture();

	// Actualiza el volumen de la musica
	void updateMusicVolume();

public:
	// Constructor
	Ending();

	// Destructor
	~Ending();

	// Bucle principal
	void run();
};