/*
 * MapIdentifiersH3M.h, part of VCMI engine
 *
 * Authors: listed in file AUTHORS in main folder
 *
 * License: GNU General Public License v2.0 or later
 * Full text of license available in license.txt file, in main folder
 *
 */

#pragma once

#include "../GameConstants.h"
#include "../filesystem/ResourcePath.h"

VCMI_LIB_NAMESPACE_BEGIN

class JsonNode;
class ObjectTemplate;

struct ObjectTypeIdentifier
{
	Obj ID;
	int32_t subID;

	bool operator < (const ObjectTypeIdentifier & other) const
	{
		if (ID != other.ID)
			return ID < other.ID;
		return subID < other.subID;
	}
};

class MapIdentifiersH3M
{
	std::map<BuildingID, BuildingID> mappingBuilding;
	std::map<FactionID, std::map<BuildingID, BuildingID>> mappingFactionBuilding;
	std::map<FactionID, FactionID> mappingFaction;
	std::map<CreatureID, CreatureID> mappingCreature;
	std::map<HeroTypeID, HeroTypeID> mappingHeroType;
	std::map<HeroTypeID, HeroTypeID> mappingHeroPortrait;
	std::map<HeroClassID, HeroClassID> mappingHeroClass;
	std::map<TerrainId, TerrainId> mappingTerrain;
	std::map<ArtifactID, ArtifactID> mappingArtifact;
	std::map<SecondarySkill, SecondarySkill> mappingSecondarySkill;

	std::map<AnimationPath, AnimationPath> mappingObjectTemplate;
	std::map<ObjectTypeIdentifier, ObjectTypeIdentifier> mappingObjectIndex;

	template<typename IdentifierID>
	void loadMapping(std::map<IdentifierID, IdentifierID> & result, const JsonNode & mapping, const std::string & identifierName);
public:
	void loadMapping(const JsonNode & mapping);

	void remapTemplate(ObjectTemplate & objectTemplate);

	BuildingID remapBuilding(std::optional<FactionID> owner, BuildingID input) const;
	HeroTypeID remapPortrait(HeroTypeID input) const;
	FactionID remap(FactionID input) const;
	CreatureID remap(CreatureID input) const;
	HeroTypeID remap(HeroTypeID input) const;
	HeroClassID remap(HeroClassID input) const;
	TerrainId remap(TerrainId input) const;
	ArtifactID remap(ArtifactID input) const;
	SecondarySkill remap(SecondarySkill input) const;

};

VCMI_LIB_NAMESPACE_END
