#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/text.h"
#include "common/utils.h"
#include "const.h"
#include <vector>

#ifndef TITLE_H
#define TITLE_H

class Title
{
private:
	struct letter_t
	{
		std::string letter; // Letra a escribir
		int x;				// Posición en el eje x
		bool enabled;		// Solo se escriben y mueven si estan habilitadas
	};

	// 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
	SDL_Event *eventHandler;	// Manejador de eventos
	Texture *texture;			// Textura con los graficos
	Sprite *sprite;				// Sprite para manejar la textura
	Text *text;					// Objeto para escribir texto en pantalla
	options_t *options;			// Puntero a las opciones del juego
	Texture *pressEnterTexture; // Textura con los graficos de PRESS ENTER
	Sprite *pressEnterSprite;	// Sprite para manejar la textura de PRESS ENTER
	section_t *section;			// Estado del bucle principal para saber si continua o se sale

	// Variables
	int counter;				   // Contador
	std::string longText;		   // Texto que aparece en la parte inferior del titulo
	Uint32 ticks;				   // Contador de ticks para ajustar la velocidad del programa
	Uint32 ticksSpeed;			   // Velocidad a la que se repiten los bucles del programa
	std::vector<letter_t> letters; // Vector con las letras de la marquesina
	int marqueeSpeed;			   // Velocidad de desplazamiento de la marquesina

	// Actualiza las variables
	void update();

	// Dibuja en pantalla
	void render();

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

	// Actualiza la marquesina
	void updateMarquee();

	// Dibuja la marquesina
	void renderMarquee();

	// Recarga las texturas
	void reLoadTextures();

	// Cambia la paleta
	void switchPalette();

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

	// Destructor
	~Title();

	// Bucle principal
	void run();
};

#endif
