#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 "text.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
	Text *debugText;		 // Objeto para escribir texto con información de debug
	Map *map;				 // Objeto encargado de gestionar el mapeado del juego
	Player *player;			 // Objeto para gestionar el jugador
	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 debug;				 // Indica si esta activo el modo de depuración

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

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

	// Comprueba la entrada
	void checkInput();

	// 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);

	// Destructor
	~Game();

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

#endif
