#pragma once
#include "olcUTIL_Geometry2D.h"
#include <set>

struct XMLTag;

enum MapName{
	CAMPAIGN_1_1,
	CAMPAIGN_1_2,
	BOSS_1,
	WORLD_MAP
};

struct TileCollisionData{
	geom2d::rect<int>collision;
};

struct TilesetData{
	Renderable*tileset=nullptr;
	int tilewidth,tileheight;
	std::map<int,XMLTag>foregroundTiles;
	std::map<int,XMLTag>upperForegroundTiles;
	std::map<int,TileCollisionData>collision;
	std::map<int,XMLTag>staircaseTiles;
	std::map<int,std::vector<int>>animationData;
	std::set<int>reflectiveData;
};

struct TilesheetData{
	TilesetData*tileset;
	int firstgid;
};

struct TileRenderData{
	TilesheetData tileSheet;
	vi2d pos;
	vi2d tileSheetPos;
	int tileID;
	int layerID;
	float tileOpacity;
};

struct TileGroup{
private:
	geom2d::rect<int>range;
	std::vector<TileRenderData>tiles;
	int minX=0,minY=0,maxX=0,maxY=0;
public:
	static float FADE_TIME;
	//0-255. 255 indicates fully invisible.
	static uint8_t FADE_AMT;
	geom2d::rect<int>GetRange();
	//The fade range is the bounds in which this tile group will be considered "in range" of a player, one tile in each direction further than its actual range.
	geom2d::rect<int>GetFadeRange();
	std::vector<TileRenderData>&GetTiles();
	void InsertTile(TileRenderData tile);
	bool playerBehind=false;
	float fadeFactor=0.f;
};