#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <string>			 // for string
#include <vector>			 // for vector
class AnimatedSprite;		 // lines 9-9
class Asset;				 // lines 10-10
class Input;				 // lines 11-11
class MovingSprite;			 // lines 12-12
class Resource;				 // lines 13-13
class Screen;				 // lines 14-14
class Text;					 // lines 15-15
struct JA_Music_t;			 // lines 16-16
struct Color;
struct Options;
struct SectionState;

class Ending2
{
private:
	// 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
	std::vector<AnimatedSprite *> sprites;	 // Vector con todos los sprites a dibujar
	std::vector<MovingSprite *> spriteTexts; // Vector con los sprites de texto de los sprites
	std::vector<MovingSprite *> texts;		 // Vector con los sprites de texto

	// Variables
	bool counterEnabled;				 // Indica si está el contador habilitado
	int preCounter;						 // Contador previo
	int postCounter;					 // Contador posterior
	bool postCounterEnabled;			 // Indica si está habilitado el contador
	Uint32 ticks;						 // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;					 // Velocidad a la que se repiten los bucles del programa
	JA_Music_t *music;					 // Musica que suena durante el final
	std::vector<std::string> spriteList; // Lista con todos los sprites a dibujar
	std::vector<Color> colors;			 // Vector con los colores para el fade
	int maxSpriteWidth;					 // El valor de ancho del sprite mas ancho
	int maxSpriteHeight;				 // El valor de alto del sprite mas alto
	int distSpriteText;					 // Distancia entre el sprite y el texto que lo acompaña
	int distSpriteSprite;				 // Distancia entre dos sprites de la misma columna
	float despSpeed;					 // Velocidad de desplazamiento de los sprites
	int firstCol;						 // Primera columna por donde desfilan los sprites
	int secondCol;						 // Segunda columna por donde desfilan los sprites

	// Actualiza el objeto
	void update();

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

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

	// Comprueba las entradas
	void checkInput();

	// Actualiza los contadores
	void updateCounters();

	// Inicializa la lista de sprites
	void iniSpriteList();

	// Carga todos los sprites desde una lista
	void loadSprites();

	// Actualiza los sprites
	void updateSprites();

	// Actualiza los sprites de texto
	void updateTextSprites();

	// Actualiza los sprites de texto del final
	void updateTexts();

	// Dibuja los sprites
	void renderSprites();

	// Dibuja los sprites con el texto
	void renderSpriteTexts();

	// Dibuja los sprites con el texto del final
	void renderTexts();

	// Coloca los sprites en su sito
	void placeSprites();

	// Crea los sprites con las texturas con los textos
	void createSpriteTexts();

	// Crea los sprites con las texturas con los textos del final
	void createTexts();

	// Borra la memoria ocupada por los sprites con las texturas de los textos
	void deleteSpriteTexts();

	// Borra la memoria ocupada por los sprites
	void deleteSprites();

	// Borra la memoria ocupada por los sprites con las texturas de los textos del final
	void deleteTexts();

	// Actualiza el fade final
	void updateFinalFade();

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

public:
	// Constructor
	Ending2();

	// Destructor
	~Ending2();

	// Bucle principal
	void run();
};
