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

#ifndef ENDING2_H
#define ENDING2_H

class Ending2
{
private:
	// Objetos y punteros
	Asset *asset;							 // Objeto con los ficheros de recursos
	Resource *resource;						 // Objeto con los recursos
	Screen *screen;							 // Objeto encargado de dibujar en pantalla
	SDL_Event *eventHandler;				 // Manejador de eventos
	SDL_Renderer *renderer;					 // El renderizador de la ventana
	Text *text;								 // Objeto para escribir texto en pantalla
	options_t *options;						 // Puntero a las opciones del juego
	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
	section_t section;					 // Estado del bucle principal para saber si continua o se sale
	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 music;						 // Musica que suena durante el final
	std::vector<std::string> spriteList; // Lista con todos los sprites a dibujar
	std::vector<color_t> 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 checkEventHandler();

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

	// Cambia la paleta
	void switchPalette();

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

	// Destructor
	~Ending2();

	// Bucle principal
	section_t run();
};

#endif
