#pragma once

#include <SDL2/SDL_rect.h>	 // for SDL_Rect
#include <SDL2/SDL_render.h> // for SDL_Renderer
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <memory>			 // for shared_ptr
class Asset;				 // lines 8-8
class Input;				 // lines 9-9
class Resource;				 // lines 10-10
class Screen;				 // lines 11-11
class Sprite;				 // lines 12-12
class Texture;				 // lines 13-13
struct JA_Music_t;			 // lines 14-14

class LoadingScreen
{
private:
	// Objetos y punteros
	std::shared_ptr<Texture> mono_loading_screen_texture_;	// Textura con la pantalla de carga en blanco y negro
	std::shared_ptr<Texture> color_loading_screen_texture_; // Textura con la pantalla de carga en color
	std::shared_ptr<Sprite> mono_loading_screen_sprite_;	// Sprite para manejar la textura loadingScreenTexture1
	std::shared_ptr<Sprite> color_loading_screen_sprite_;	// Sprite para manejar la textura loadingScreenTexture2

	// Variables
	int pre_counter_ = 0;				 // Contador previo para realizar una pausa inicial
	int counter_ = 0;					 // Contador
	Uint32 ticks_ = 0;					 // Contador de ticks para ajustar la velocidad del programa
	int load_counter_ = 0;				 // Contador para controlar las cargas
	bool loading_first_part_ = true;	 // Para saber en que parte de la carga se encuentra
	int line_index_[192];				 // El orden en el que se procesan las 192 lineas de la pantalla de carga
	SDL_Rect load_rect_ = {0, 0, 51, 1}; // Rectangulo para dibujar la pantalla de carga
	SDL_Texture *texture_;				 // Textura para dibujar la pantalla de carga

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

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

	// Comprueba las entradas
	void checkInput();

	// Gestiona el contador interno
	void updateCounter();

	// Gestiona el contador de carga
	void updateLoad();

	// Dibuja la pantalla de carga
	void renderLoad();

	// Dibuja el efecto de carga en el borde
	void renderBorder();

	// Dibuja sobre la textura
	void fillTexture();

	// Limpia la textura
	void clearTexture();

public:
	// Constructor
	LoadingScreen();

	// Destructor
	~LoadingScreen();

	// Bucle principal
	void run();
};