#include "AnimationEventLists.h"

/*
/* The lists in this file might not contain all relevant animation events, so extend as necessary
*/

const Map<std::string_view, std::string_view> AnimationEventLists::kIdleToInstant = {
    // Idle animations that have instant counterparts
    {"HorseEnter", "HorseEnterInstant"},
    {"IdleAlchemyEnter", "IdleAlchemyEnterInstant"},
    {"IdleAltarEnter", "IdleAltarEnterInstant"},
    {"IdleBarCounterEnter", "IdleBarCounterEnterInstant"},
    {"IdleBedEnterStart", "IdleBedEnterInstant"},
    {"IdleBedLeftEnterStart", "IdleBedLeftEnterInstant"},
    {"IdleBedRightEnterStart", "IdleBedRightEnterInstant"},
    {"IdleBedRollFrontEnterStart", "IdleBedRollFrontEnterInstant"},
    {"IdleBedRollLeftEnterStart", "IdleBedRollLeftEnterInstant"},
    {"IdleBedRollRightEnterStart", "IdleBedRollRightEnterInstant"},
    {"IdleBlackSmithingEnterStart", "IdleBlackSmithEnterInstant"},
    {"IdleBlessingKneelEnter", "IdleBlessingKneelEnterInstant"},
    {"IdleBoundKneesStart", "IdleBoundKneesEnterInstant"},
    {"IdleCartTravelDriverEnter", "IdleCartTravelDriverEnterInstant"},
    {"IdleCartTravelPlayerEnter", "IdleCartTravelPlayerEnterInstant"},
    {"IdleChairCHILDFrontEnter", "IdleChairCHILDEnterInstant"},
    {"IdleChairCHILDLeftEnter", "IdleChairCHILDEnterInstant"},
    {"IdleChairCHILDRightEnter", "IdleChairCHILDEnterInstant"},
    {"IdleChairEnterStart", "IdleChairEnterInstant"},
    {"IdleChairEnterToSit", "IdleChairEnterInstant"},
    {"IdleChairFrontEnter", "IdleChairEnterInstant"},
    {"IdleChairLeftEnter", "IdleChairEnterInstant"},
    {"IdleChairRightEnter", "IdleChairEnterInstant"},
    {"IdleChildSitOnKnees", "IdleChildSitOnKneesInstant"},
    {"IdleCoffinEnter", "IdleCoffinEnterInstant"},
    {"IdleCookingPotEnter", "IdleCookingPotEnterInstant"},
    {"IdleCookingSpitEnter", "IdleCookingSpitEnterInstant"},
    {"IdleCounterStart", "IdleCounterEnterInstant"},
    {"IdleCowerEnter", "IdleCowerEnterInstant"},
    {"IdleDLC2PickaxeEnter", "IdleDLC2PickaxeEnterInstant"},
    {"IdleEnchantingEnter", "IdleEnchantingEnterInstant"},
    {"IdleExecutionerIdle", "IdleExecutionerIdleEnterInstant"},
    {"IdleGrainMillEnter", "IdleGrainMillEnterInstant"},
    {"IdleHammerTableEnter", "IdleHammerTableEnterInstant"},
    {"IdleHammerWallEnter", "IdleHammerWallEnterInstant"},
    {"IdleHideLEnter", "IdleHideLEnterInstant"},
    {"IdleHideREnter", "IdleHideREnterInstant"},
    {"IdleJarlChairEnter", "IdleJarlChairEnterInstant"},
    {"IdleLayDownEnter", "IdleLayDownEnterInstant"},
    {"IdleLeanTable", "IdleLeanTableEnterInstant"},
    {"IdleLeanTableEnter", "IdleLeanTableEnterInstant"},
    {"IdleLeverPushStart", "IdleLeverPushEnterInstant"},
    {"IdleOvenEnter", "IdleOvenEnterInstant"},
    {"IdlePickaxeEnter", "IdlePickaxeEnterInstant"},
    {"IdlePickaxeFloorEnter", "IdlePickaxeFloorEnterInstant"},
    {"IdlePickaxeTableEnter", "IdlePickaxeTableEnterInstant"},
    {"IdlePrayCrouchedEnter", "IdlePrayCrouchedEnterInstant"},
    {"IdleRailLeanEnter", "IdleRailLeanEnterInstant"},
    {"IdleSearchingChest", "IdleSearchChestEnterInstant"},
    {"IdleSearchingTable", "IdleSearchTableEnterInstant"},
    {"IdleSharpeningWheelStart", "IdleSharpeningWheelEnterInstant"},
    {"IdleSitCrossLeggedEnter", "IdleSitCrossLeggedEnterInstant"},
    {"IdleSitLedgeEnter", "IdleSitLedgeEnterInstant"},
    {"IdleSmelterEnter", "IdleSmelterEnterInstant"},
    {"IdleSnowElfPrinceChairEnter", "IdleSnowElfPrinceChairEnterInstant"},
    {"IdleStoolEnter", "IdleStoolEnterInstant"},
    {"IdleTableEnter", "IdleTableEnterInstant"},
    {"IdleTableEnterPlayer", "IdleTableEnterInstant"},
    {"IdleTanningEnter", "IdleTanningEnterInstant"},
    {"IdleWallLeanStart", "IdleWallLeanEnterInstant"},
    {"IdleWallSoldierEnter", "IdleWallSoldierEnterInstant"},
    {"IdleWoodChopStart", "IdleWoodChopEnterInstant"},
    {"IdleWoodPickUpEnter", "IdleWoodPickUpEnterInstant"},
    // ...there is probably more

    // No instant counterpart exists
    {"IdleBeggar", ""},
    {"IdleCombatShieldStart", ""},
    {"IdleCombatStart", ""},
    {"IdleDialogueAngryStart", ""},
    {"IdleDialogueExpressiveStart", ""},
    {"IdleDialogueHappyStart", ""},
    {"idleDrinkingStandingStart", ""},
    {"IdleDrumStart", ""},
    {"idleEatingStandingStart", ""},
    {"IdleFluteStart", ""},
    {"IdleFurnitureStart", ""},
    {"IdleGetAttention", ""},
    {"idleLooseSweepingStart", ""},
    {"IdleLuteStart", ""},
    {"IdleReadElderScrollStart", ""},
    {"IdleTableDrinkAndMugEnter", ""},
    {"IdleTableDrinkEnter", ""},
    {"IdleTableMugEnter", ""},
    {"IdleTablePassOutEnter", ""},
    {"IdleWarmHands", ""},
};

const Set<std::string_view> AnimationEventLists::kExitSpecial = {
    {"IdleForceDefaultState"},
    {"IdleReturnToDefault"},
    {"ReturnDefaultState"},
    {"ReturnToDefault"},
    {"ForceFurnExit"},
    {"IdleStop"},
    {"IdleStopInstant"},
    {"IdleBedExitToStand"},
    {"IdleChairExitToStand"},
    {"IdleFurnitureExitSlow"},
    {"IdleMesmerizeStop"},
    {"IdleWoodChopStop"},
    {"BlackSmithAnvilExit"},
    {"BlacksmithSharpeningWheelExit"},
    {"BleedOutEarlyExit"},
    {"CartExit"},
    {"CraftingEnchantingBenchExit"},
    {"DragonMountExit"},
    {"DragonMountExitOut"},
    {"GetUpExit"},
    {"HorseExit"},
    {"HorseExitOut"},
    {"LayExit"},
    {"NPCDragonMountExitOut"},
    {"NPCHorseExit"},
    {"NPCHorseExitOut"},
    {"StoolBackExit"},
    {"TableBackExit"},
    {"TrapExitStart"},
    {"VehicleExit"},
    {"WebIdleExit"},
    {"GetUpBegin"}, // Not an "Exit" action per se, but belongs here as it makes the actor return to its initial anim
                    // state
    // ...others are checked in `IsExitAction()` using ends_with
};

const Set<std::string_view> AnimationEventLists::kIgnore = {
    // Animation events with empty names don't carry anything useful besides
    // various animvars updates and state changes to the currently running animations.
    // Ignored because they spam too much
    {""},
    {"TurnLeft"},
    {"TurnRight"},
    {"turnStop"},
    {"CyclicFreeze"},
    {"CyclicCrossBlend"},
    {"NPC_BumpedFromBack"},
    {"NPC_BumpedFromLeft"},
    {"NPC_BumpedFromRight"},
    {"NPC_BumpEnd"},
    {"NPC_BumpFromFront"},
    {"NPC_TurnLeft180"},
    {"NPC_TurnLeft90"},
    {"NPC_TurnRight180"},
    {"NPC_TurnRight90"},
    {"NPC_TurnToWalkLeft180"},
    {"NPC_TurnToWalkLeft90"},
    {"NPC_TurnToWalkRight180"},
    {"NPC_TurnToWalkRight90"},
    // Ignore jump animations
    {"JumpDirectionalStart"},
    {"JumpFall"},
    {"JumpFallDirectional"},
    {"JumpFastEnd"},
    {"JumpFastLeft"},
    {"JumpFastRight"},
    {"JumpForwardEnd"},
    {"JumpForwardStart"},
    {"JumpLand"},
    {"JumpLandDirectional"},
    {"JumpLandEnd"},
    {"JumpLandFailSafe"},
    {"JumpLandFast"},
    {"JumpLandSoft"},
    {"JumpSoftEnd"},
    {"JumpStandingStart"},
    // Useless idles, sometimes spam
    {"IdlePlayer"},
    {"IdleChairVar1"},
    {"idleChairVar2"},
    {"idleChairArmsCrossedVar1"},
    {"idleChairArmsCrossedVar2"},
    // See `Actor::FixVampireLordModel`
    {"LevitationToggle"},
    // Weapon drawing is handled separately in CharacterService
    {"WeapEquip"},
    {"WeapSoloEquip"},
    {"WeapForceEquip"},
    {"WeapEquip_Out"},
    {"WeapUnEquip"},
    // https://github.com/tiltedphoques/TiltedEvolution/issues/810
    {"Unequip"},
    {"combatStanceStop"},
};
