#pragma once

#include <SDL2/SDL_events.h> // for SDL_Event
#include <SDL2/SDL_rect.h>	 // for SDL_Point, SDL_Rect
#include <SDL2/SDL_render.h> // for SDL_Texture, SDL_Renderer
#include <SDL2/SDL_stdinc.h> // for Uint32
#include <vector>			 // for vector
#include <memory>
#include "fade.h"
#include "sprite.h"
#include "text.h"
#include "texture.h"
#include "tiled_bg.h"
struct JA_Music_t;

/*
	Esta clase gestiona un estado del programa. Se encarga de poner en pantalla
	un texto explicativo para entender como se juega.

	Ademas muestra algunos items y explica para qué sirven.

	Utiliza dos texturas de apoyo, una con el texto ya escrito y otra donde se combina
	tanto el texto de la primera textura como los sprites de los items.

	Finalmente, una ventana recorre la textura para dar el efecto de que todo se desplaza
	por la pantalla sobre el mosaico de fondo (gestionado por el correspondiente objeto)
*/

// Clase Instructions
class Instructions
{
private:
	// Objetos y punteros
	std::vector<std::shared_ptr<Texture>> itemTextures; // Vector con las texturas de los items
	std::vector<std::unique_ptr<Sprite>> sprites;		// Vector con los sprites de los items
	std::unique_ptr<SDL_Event> eventHandler;			// Manejador de eventos
	std::unique_ptr<Text> text;							// Objeto para escribir texto
	std::unique_ptr<Tiledbg> tiledbg;					// Objeto para dibujar el mosaico animado de fondo
	std::unique_ptr<Fade> fade;							// Objeto para renderizar fades

	SDL_Renderer *renderer;	 // El renderizador de la ventana
	JA_Music_t *music;		 // Musica de fondo
	SDL_Texture *texture;	 // Textura fija con el texto
	SDL_Texture *backbuffer; // Textura para usar como backbuffer

	// Variables
	int counter;		 // Contador
	int counterEnd;		 // Valor final para 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
	SDL_Rect view;		 // Vista del backbuffer que se va amostrar por pantalla
	SDL_Point spritePos; // Posición del primer sprite
	int itemSpace;		 // Espacio entre los items

	// Actualiza las variables
	void update();

	// Pinta en pantalla
	void render();

	// Comprueba los eventos
	void checkEvents();

	// Comprueba las entradas
	void checkInput();

	// Rellena la textura de texto
	void fillTexture();

	// Rellena el backbuffer
	void fillBackbuffer();

	// Inicializa los sprites de los items
	void iniSprites();

	// Actualiza los sprites
	void updateSprites();

	// Recarga todas las texturas
	void reloadTextures();

public:
	// Constructor
	Instructions(JA_Music_t *music);

	// Destructor
	~Instructions();

	// Bucle principal
	void run();
};