#pragma once
#include <SDL2/SDL.h>
#include "common/asset.h"
#include "common/jail_audio.h"
#include "common/resource.h"
#include "common/screen.h"
#include "common/sprite.h"
#include "common/sprite.h"
#include "common/text.h"
#include "common/texture.h"
#include "common/utils.h"
#include "const.h"
#include <string>
#include <vector>

#ifndef ENDING_H
#define ENDING_H

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

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

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

	// Cambia la paleta
	void switchPalette();

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

	// Destructor
	~Ending();

	// Bucle principal
	void run();
};

#endif
