// Copyright (c) 2023 Alex Diener. All rights reserved.

#ifndef __GameData_H__
#define __GameData_H__

#include "gamemath/Rect4i.h"
#include "gamemath/Vector2i.h"
#include "gamemath/Vector2u.h"
#include "PROJECT_NAME/Music.h"
#include "tileset/TileMapEditData.h"
#include "utilities/Atom.h"

typedef enum RoomLayerType {
	ROOM_LAYER_TYPE_GROUND = 0,
	ROOM_LAYER_TYPE_OBSTACLE = 1,
	ROOM_LAYER_TYPE_ENTITY = 2
} RoomLayerType;

typedef enum TilePropertyBits {
	TILE_STATIC_FLOOR = 0x01,
	TILE_STATIC_WALL = 0x02,
	TILE_OUT_OF_BOUNDS = 0x1000
} TilePropertyBits;

typedef struct RoomLayerData {
	RoomLayerType type;
	Vector2i offset;
	TileInstanceGrid tileGrid;
} RoomLayerData;

typedef struct RoomData {
	TileMapID identifier;
	int zoneLayer;
	Vector2i zonePosition;
	Vector2u size;
	unsigned int layerCount;
	RoomLayerData * layers;
	MusicID musicID;
} RoomData;

typedef struct GameData {
	unsigned int roomCount;
	RoomData * rooms;
	TileMapID startingRoomIdentifier;
	char * startingRoomEntranceName;
} GameData;

GameData * GameData_create(void);
void GameData_dispose(GameData * data);
RoomData * GameData_getRoomDataByIdentifier(GameData * zone, TileMapID roomIdentifier, unsigned int * outRoomIndex);
unsigned int GameData_getRoomIndexAtZonePosition(GameData * zone, int zoneLayer, Vector2i zonePosition);
DataHashTable * RoomData_getRoomEntranceByName(RoomData * room, const char * entranceName, Vector2i * outPosition);
Rect4i RoomData_getLocalBounds(RoomData * room);
TilePropertyBits getTileProperties(TileID tileID);

#endif
