#pragma once

#include <SDL3/SDL_stdinc.h> // Para Uint32, Uint8
#include <memory>			 // Para unique_ptr
#include <vector>			 // Para vector
#include "path_sprite.h"	 // Para PathSprite
#include "tiled_bg.h"		 // Para TiledBG
#include "writer.h"			 // Para Writer

/*
	Esta clase gestiona un estado del programa. Se encarga de mostrar la secuencia
	de introducción.
*/

// Clase Intro
class Intro
{
public:
	// Constructor
	Intro();

	// Destructor
	~Intro() = default;

	// Bucle principal
	void run();

private:
	// --- Estados internos ---
	enum class IntroState
	{
		SCENES,
		POST,
	};

	enum class IntroPostState
	{
		STOP_BG,
		END,
	};

	// --- Objetos ---
	std::vector<std::unique_ptr<PathSprite>> sprites_;		  // Vector con los sprites inteligentes para los dibujos de la intro
	std::vector<std::unique_ptr<PathSprite>> shadow_sprites_; // Vector con los sprites inteligentes para las sombras
	std::vector<std::unique_ptr<Writer>> texts_;			  // Textos de la intro
	std::unique_ptr<TiledBG> tiled_bg_;						  // Fondo en mosaico

	// --- Variables ---
	Uint64 ticks_ = 0;									  // Contador de ticks para ajustar la velocidad del programa
	int scene_ = 0;										  // Indica qué escena está activa
	IntroState state_ = IntroState::SCENES;				  // Estado principal de la intro
	IntroPostState post_state_ = IntroPostState::STOP_BG; // Estado POST
	Uint32 state_start_time_;							  // Tiempo de inicio del estado actual
	Uint8 bg_color_ = 112;								  // Color de fondo

	// --- Métodos internos ---
	void update();			// Actualiza las variables del objeto
	void render();			// Dibuja el objeto en pantalla
	void checkEvents();		// Comprueba los eventos
	void checkInput();		// Comprueba las entradas
	void updateScenes();	// Actualiza las escenas de la intro
	void initSprites();		// Inicializa las imágenes
	void initTexts();		// Inicializa los textos
	void updateSprites();	// Actualiza los sprites
	void updateTexts();		// Actualiza los textos
	void renderSprites();	// Dibuja los sprites
	void renderTexts();		// Dibuja los textos
	void updatePostState(); // Actualiza el estado POST
};
