#pragma once

#include <SDL2/SDL.h>
#include "utils.h"
#include "asset.h"
#include "const.h"
#include "enemy.h"
#include <string>
#include <vector>
#include <sstream>
#include <fstream>

#ifndef MAP_H
#define MAP_H

enum e_tile_map
{
	nothing,
	wall,
	passable
};

enum e_border
{
	b_none,
	b_top,
	b_bottom,
	b_left,
	b_right
};

// The player
class Map
{
private:
	Asset *asset;					 // Objeto con la ruta a todos los ficheros de recursos
	SDL_Renderer *renderer;			 // El renderizador de la ventana
	std::string room_up;			 // Identificador de la habitación que se encuentra arriba
	std::string room_down;			 // Identificador de la habitación que se encuentra abajp
	std::string room_left;			 // Identificador de la habitación que se encuentra a la izquierda
	std::string room_right;			 // Identificador de la habitación que se encuentra a la derecha
	std::string tileset_img;		 // Imagen con los graficos para la habitación
	std::vector<int> tilemap;		 // Indice de los tiles a dibujar en la habitación
	LTexture *texture_tile;			 // Textura con los graficos de los tiles habitación
	SDL_Texture *map_texture;		 // Textura para dibujar el mapa de la habitación
	std::vector<Enemy *> enemy_list; // Listado con los enemigos de la habitación

	int tile_size;	   // Ancho del tile en pixels
	int map_width;	   // Ancho del mapa en tiles
	int map_height;	   // Alto del mapa en tiles
	int tileset_width; // Ancho del tileset en tiles

	// Carga las variables desde un fichero
	bool load(std::string file);

	// Asigna variables a partir de dos cadenas
	bool setVars(std::string var, std::string value);

	// Asigna variables a una estructura enemy_t
	bool setEnemy(enemy_t *enemy, std::string var, std::string value);

	// Pinta el mapa de la habitación en la textura
	void fillMapTexture();

public:
	// Constructor
	Map(std::string file, SDL_Renderer *renderer, Asset *asset);

	// Destructor
	~Map();

	// Actualiza todas las variables
	void update();

	// Dibuja el objeto
	void render();

	// Devuelve el tipo de tile que hay en un punto
	e_tile_map getTile(SDL_Point p);

	// Devuelve el valor de la variable
	int getTileSize();

	// Devuelve el indice del tile correspondiente a un punto del mapa
	int getTileIndex(SDL_Point p);

	// Devuelve el valor de los bordes de la zona de juego
	int getPlayArea(e_border border);

	// Devuelve el nombre del fichero de la habitación en funcion del borde
	std::string getRoomFileName(e_border border);
};

#endif
