#pragma once

#include <SDL2/SDL.h>
#include "common/asset.h"
#include "common/jail_audio.h"
#include "common/resource.h"
#include "common/screen.h"
#include "common/sprite.h"
#include "common/utils.h"
#include "const.h"
#include <vector>

#include <string>
#include "common/text.h"

#ifndef INTRO_H
#define INTRO_H

class Intro
{
private:
	// Objetos y punteros
	SDL_Renderer *renderer;			// El renderizador de la ventana
	Screen *screen;					// Objeto encargado de dibujar en pantalla
	Resource *resource;				// Objeto con los recursos
	Asset *asset;					// Objeto con los ficheros de recursos
	Texture *loadingScreenTexture1; // Textura con la pantalla de carga en blanco y negro
	Texture *loadingScreenTexture2; // Textura con la pantalla de carga en color
	SDL_Event *eventHandler;		// Manejador de eventos
	Sprite *sprite1;				// Sprite para manejar la textura loadingScreenTexture1
	Sprite *sprite2;				// Sprite para manejar la textura loadingScreenTexture2
	options_t *options;				// Puntero a las opciones del juego
	section_t *section;		// Estado del bucle principal para saber si continua o se sale

	// Variables
	int preCounter;			// Contador previo para realizar una pausa inicial
	int counter;			// Contador
	Uint32 ticks;			// Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;		// Velocidad a la que se repiten los bucles del programa
	int loadCounter;		// Contador para controlar las cargas
	bool loadingFirstPart;	// Para saber en que parte de la carga se encuentra
	JA_Music_t* loadingSound1; // Sonidos para imitar la carga tipo spectrum
	JA_Music_t* loadingSound2; // Sonidos para imitar la carga tipo spectrum
	JA_Music_t* loadingSound3; // Sonidos para imitar la carga tipo spectrum
	int lineIndex[192];		// El orden en el que se procesan las 192 lineas de la pantalla de carga
	SDL_Rect loadRect;		// Rectangulo para dibujar la pantalla de carga

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

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

	// Gestiona el contador interno
	void updateCounter();

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

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

	// Cambia la paleta
	void switchPalette();

	// Reconstruye la pantalla de carga
	void recreateLoadingScreen();

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

	// Destructor
	~Intro();

	// Bucle principal
	void run();
};

#endif
