#pragma once

#include <SDL2/SDL.h>
#include "utils.h"
#include "asset.h"
#include "const.h"
#include "item_tracker.h"
#include "actor_moving_platform.h"
#include "actor_diamond.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 name;			   // Identificador de la habitación
	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 enemy_file;		   // Fichero con los enemigos para la habitación
	std::string tileset_img;	   // Imagen con los graficos para la habitación
	std::vector<int> tilemap_l0;   // Indice de los tiles a dibujar de la capa 0 en la habitación
	std::vector<int> tilemap_l1;   // Indice de los tiles a dibujar de la capa 1 en la habitación
	std::vector<int> collisionmap; // Indice con los tipos de tile de la habitación
	LTexture *texture_tile;		   // Textura con los graficos de los tiles habitación
	SDL_Texture *map_layer0;	   // Textura para dibujar la capa 0 del mapa de la habitación
	SDL_Texture *map_layer1;	   // Textura para dibujar la capa 1 del mapa de la habitación
	std::vector<Actor *> actors;   // Listado con los actores de la habitación
	color_t bgColor1;			   // Color superior del degradado de fondo
	color_t bgColor2;			   // Color inferior del degradado de fondo
	ItemTracker *itemTracker;	   // Objeto que gestiona los items que ya se han recogido

	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 actor_t
	bool setActor(actor_t *actor, SDL_Point *p1, SDL_Point *p2, 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, ItemTracker *itemTracker);

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

	// Devuelve el nombre del fichero de la habitación
	std::string getName();

	// Indica si hay colision con un actor a partir de un rectangulo
	int actorCollision(SDL_Rect &rect);

	// Indica si hay colision con un actor a partir de un punto
	int actorCollision(SDL_Point &p);

	// Devuelve el nombre del actor a pàrtir de un índice
	int getActorName(int index);

	// Devuelve el rectangulo de colisión
	SDL_Rect getActorCollider(int index);

	// Devuelve el desplazamiento relativo del actor
	int getActorIncX(int index);

	// Elimina un actor
	bool deleteActor(int index);

	// Coge un item
	void getItem(int index);

	// Obtiene el valor de la variable
	std::string getEnemyFile();
};

#endif
