#pragma once

#include <SDL2/SDL.h>
#include "utils.h"
#include "asset.h"
#include "screen.h"
#include "input.h"
#include "map.h"
#include "player.h"
#include "item_tracker.h"
#include "enemy_engine.h"
#include "text.h"
#include "debug.h"

#ifndef GAME_H
#define GAME_H

class Game
{
private:
	SDL_Renderer *renderer;	  // El renderizador de la ventana
	Asset *asset;			  // Objeto encargado de gestionar los ficheros de recursos
	Screen *screen;			  // Objeto encargado de dibujar en pantalla
	Input *input;			  // Objeto Input para gestionar las entradas
	SDL_Event *eventHandler;  // Manejador de eventos
	JA_Music music;			  // Contiene la musica que se reproduce durante el juego
	Map *map;				  // Objeto encargado de gestionar el mapeado del juego
	Player *player;			  // Objeto para gestionar el jugador
	ItemTracker *itemTracker; // Objeto para gestionar los items recogidos
	EnemyEngine *enemyEngine; // Objeto encargado de gestionar los enemigos
	Debug *debug;			  // Objeto para gestionar la información de debug
	section_t section;		  // Seccion actual dentro del programa
	int ticks;				  // Contador de ticks para ajustar la velocidad del programa
	int ticksSpeed;			  // Velocidad a la que se repiten los bucles del programa
	bool musicEnabled;		  // Indica si la musica puede sonar o no

	// Actualiza el juego, las variables, comprueba la entrada, etc.
	void update();

	// Pinta los objetos en pantalla
	void render();

	// Comprueba los eventos de la cola
	void checkEventHandler();

	// Pone la información de debug en pantalla
	void updateDebugInfo();

	// Muestra información de depuración
	void renderDebugInfo();

	// Cambia el mapa
	bool changeMap(std::string file);

	// Comprueba si el jugador está en el borde y se ha de cambiar el mapa
	void checkScreenBorders();

public:
	// Constructor
	Game(SDL_Renderer *renderer, Screen *screen, Asset *asset, Input *input, Debug *debug);

	// Destructor
	~Game();

	// Bucle para el juego
	section_t run();
};

#endif
