#pragma once

#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>			 // for shared_ptr
#include <string>			 // for string
#include <vector>			 // for vector
#include "defines.h"		 // for GAMECANVAS_WIDTH, GAMECANVAS_FIRST_QUAR...
#include "utils.h"			 // for Color
class SAnimatedSprite;		 // lines 10-10
class SMovingSprite;		 // lines 13-13

class Ending2
{
private:
	// Constantes
	static constexpr int FIRST_COL_ = GAMECANVAS_FIRST_QUARTER_X + (GAMECANVAS_WIDTH / 16);	 // Primera columna por donde desfilan los sprites
	static constexpr int SECOND_COL_ = GAMECANVAS_THIRD_QUARTER_X - (GAMECANVAS_WIDTH / 16); // Segunda columna por donde desfilan los sprites
	static constexpr int DIST_SPRITE_TEXT_ = 8;												 // Distancia entre el sprite y el texto que lo acompaña
	static constexpr int DIST_SPRITE_SPRITE_ = 0;											 // Distancia entre dos sprites de la misma columna
	static constexpr float SPRITE_DESP_SPEED_ = -0.2f;										 // Velocidad de desplazamiento de los sprites

	// Objetos y punteros
	std::vector<std::shared_ptr<SAnimatedSprite>> sprites_;	   // Vector con todos los sprites a dibujar
	std::vector<std::shared_ptr<SMovingSprite>> sprite_texts_; // Vector con los sprites de texto de los sprites
	std::vector<std::shared_ptr<SMovingSprite>> texts_;		   // Vector con los sprites de texto

	// Variables
	bool counter_enabled_;				   // Indica si está el contador habilitado
	int pre_counter_;					   // Contador previo
	int post_counter_;					   // Contador posterior
	bool post_counter_enabled_;			   // Indica si está habilitado el contador
	Uint32 ticks_;						   // Contador de ticks para ajustar la velocidad del programa
	std::vector<std::string> sprite_list_; // Lista con todos los sprites a dibujar
	std::vector<Uint8> colors_;			   // Vector con los colores para el fade
	int sprite_max_width_;				   // El valor de ancho del sprite mas ancho
	int sprite_max_height_;				   // El valor de alto del sprite mas alto

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

	// Actualiza el fade final
	void updateFinalFade();

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

public:
	// Constructor
	Ending2();

	// Destructor
	~Ending2() = default;

	// Bucle principal
	void run();
};
