#pragma once

#include <frostbite2D/types/type_math.h>
#include <map>
#include <string>
#include <vector>

namespace frostbite2D::game {

struct AreaConfig {
  std::string mapPath;
  std::string mapType;
  Vec2 generatePos = Vec2(-1.0f, -1.0f);
};

struct TownConfig {
  std::string townName;
  std::string enteringTitle;
  std::string enteringCutscene;
  int needQuestId = -1;
  int needLevel = -1;
  std::map<int, AreaConfig> areas;
};

struct BackgroundAnimationConfig {
  std::string filename;
  std::string layer;
  std::string order;
};

struct MapAnimationConfig {
  std::string filename;
  std::string layer;
  int xPos = 0;
  int yPos = 0;
  int zPos = 0;
};

struct MoveAreaTarget {
  int town = -2;
  int area = -2;
};

struct MoveAreaBounds {
  Vec2 leftTop = Vec2::Zero();
  Vec2 rightBottom = Vec2::Zero();
};

struct TileInfo {
  std::string spritePath;
  int spriteIndex = 0;
};

struct MapConfig {
  std::string name;
  std::string mapPath;
  std::string mapDir;
  int backgroundPos = 0;
  Vec2 tilePos = Vec2::Zero();
  int farSightScroll = 100;
  bool hasCameraLimit = false;
  int cameraLimitMinX = -1;
  int cameraLimitMaxX = -1;
  int cameraLimitMinY = -1;
  int cameraLimitMaxY = -1;
  std::vector<std::string> tilePaths;
  std::vector<std::string> extendedTilePaths;
  std::vector<BackgroundAnimationConfig> backgroundAnimations;
  std::vector<MapAnimationConfig> mapAnimations;
  std::vector<std::string> soundIds;
  std::vector<Vec2> virtualMovablePolygon;
  std::vector<Rect> townMovableAreas;
  std::vector<MoveAreaBounds> townMovableAreaBounds;
  std::vector<MoveAreaTarget> townMovableAreaTargets;
};

std::map<int, std::string> loadTownList();
bool loadTownConfig(const std::string& townPath, TownConfig& outConfig);
bool loadMapConfig(const std::string& mapPath, MapConfig& outConfig);
bool loadTileInfo(const std::string& path, TileInfo& outInfo);

} // namespace frostbite2D::game
