#pragma once

#include <SDL2/SDL_render.h> // for SDL_Renderer, SDL_Texture
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>			 // for shared_ptr
#include <string>			 // for string
#include <vector>			 // for vector
class Asset;				 // lines 9-9
class Input;				 // lines 10-10
class Resource;				 // lines 11-11
class Screen;				 // lines 12-12
class Sprite;				 // lines 13-13
class Text;					 // lines 14-14
class Texture;				 // lines 15-15
struct JA_Music_t;			 // lines 16-16

class Ending
{
private:
	// Estructuras
	struct EndingTexture // Estructura con dos texturas y sprites, uno para mostrar y el otro hace de cortinilla
	{
		std::shared_ptr<Texture> texture;		// Textura a mostrar
		std::shared_ptr<Sprite> sprite;			// Sprite para mostrar la textura
		std::shared_ptr<Texture> cover_texture; // Textura que cubre a la otra textura
		std::shared_ptr<Sprite> cover_sprite;	// Sprite para mostrar la textura que cubre a la otra textura
		int clip_desp;							// Desplazamiento del spriteClip de la textura de cobertura
		int clip_height;						// Altura del spriteClip de la textura de cobertura
	};

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

	struct TextIndex
	{
		int index;
		int trigger;
	};

	struct SceneData // Estructura para crear cada una de las escenas del final
	{
		std::vector<TextIndex> text_index; // Indices del vector de textos a mostrar y su disparador
		int picture_index;			   // Indice del vector de imagenes a mostrar
		int counter_end;			   // Valor del contador en el que finaliza la escena
	};

	// Objetos y punteros
	SDL_Texture *cover_texture_; // Textura para cubrir el texto

	// Variables
	int counter_;							  // Contador
	int pre_counter_;						  // Contador previo
	int cover_counter_;						  // Contador para la cortinilla
	Uint32 ticks_;							  // Contador de ticks para ajustar la velocidad del programa
	std::vector<EndingTexture> sprite_texts_; // Vector con los sprites de texto con su cortinilla
	std::vector<EndingTexture> sprite_pics_;  // Vector con los sprites de texto con su cortinilla
	int current_scene_;						  // Escena actual
	std::vector<SceneData> scenes_;			  // Vector con los textos e imagenes de cada escena

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