// SPDX-FileCopyrightText: 2021 Johannes Loher
// SPDX-FileCopyrightText: 2021 Oliver Rümpelein
// SPDX-FileCopyrightText: 2021 Gesina Schwalbe
// SPDX-FileCopyrightText: 2021 Siegfried Krug
//
// SPDX-License-Identifier: MIT

const i18nKeys = {
  /**
   * Define the set of acttack types that can be performed with weapon items
   */
  attackTypes: {
    melee: "DS4.AttackTypeMelee",
    ranged: "DS4.AttackTypeRanged",
    meleeRanged: "DS4.AttackTypeMeleeRanged",
  },

  /**
   * Define the set of item availabilties
   */
  itemAvailabilities: {
    unset: "DS4.ItemAvailabilityUnset",
    hamlet: "DS4.ItemAvailabilityHamlet",
    village: "DS4.ItemAvailabilityVilage",
    city: "DS4.ItemAvailabilityCity",
    elves: "DS4.ItemAvailabilityElves",
    dwarves: "DS4.ItemAvailabilityDwarves",
    nowhere: "DS4.ItemAvailabilityNowhere",
  },

  /**
   * Define the set of item types
   */
  itemTypes: {
    weapon: "DS4.ItemTypeWeapon",
    armor: "DS4.ItemTypeArmor",
    shield: "DS4.ItemTypeShield",
    spell: "DS4.ItemTypeSpell",
    equipment: "DS4.ItemTypeEquipment",
    loot: "DS4.ItemTypeLoot",
    talent: "DS4.ItemTypeTalent",
    racialAbility: "DS4.ItemTypeRacialAbility",
    language: "DS4.ItemTypeLanguage",
    alphabet: "DS4.ItemTypeAlphabet",
    specialCreatureAbility: "DS4.ItemTypeSpecialCreatureAbility",
  },

  /**
   * Define the set of armor types, a character may only wear one item of each at any given time
   */
  armorTypes: {
    body: "DS4.ArmorTypeBody",
    helmet: "DS4.ArmorTypeHelmet",
    vambrace: "DS4.ArmorTypeVambrace",
    greaves: "DS4.ArmorTypeGreaves",
    vambraceGreaves: "DS4.ArmorTypeVambraceGreaves",
  },

  /**
   * Define abbreviations for the armor types
   */
  armorTypesAbbr: {
    body: "DS4.ArmorTypeBodyAbbr",
    helmet: "DS4.ArmorTypeHelmetAbbr",
    vambrace: "DS4.ArmorTypeVambraceAbbr",
    greaves: "DS4.ArmorTypeGreavesAbbr",
    vambraceGreaves: "DS4.ArmorTypeVambraceGreavesAbbr",
  },

  /**
   * Define the set of armor materials, used to determine if a character may wear the armor without additional penalties
   */
  armorMaterialTypes: {
    cloth: "DS4.ArmorMaterialTypeCloth",
    leather: "DS4.ArmorMaterialTypeLeather",
    chain: "DS4.ArmorMaterialTypeChain",
    plate: "DS4.ArmorMaterialTypePlate",
    natural: "DS4.ArmorMaterialTypeNatural",
  },

  /**
   * Define the abbreviations of armor materials
   */
  armorMaterialTypesAbbr: {
    cloth: "DS4.ArmorMaterialTypeClothAbbr",
    leather: "DS4.ArmorMaterialTypeLeatherAbbr",
    chain: "DS4.ArmorMaterialTypeChainAbbr",
    plate: "DS4.ArmorMaterialTypePlateAbbr",
    natural: "DS4.ArmorMaterialTypeNaturalAbbr",
  },

  spellTypes: {
    spellcasting: "DS4.SpellTypeSpellcasting",
    targetedSpellcasting: "DS4.SpellTypeTargetedSpellcasting",
  },

  spellGroups: {
    lightning: "DS4.SpellGroupLightning",
    earth: "DS4.SpellGroupEarth",
    water: "DS4.SpellGroupWater",
    ice: "DS4.SpellGroupIce",
    fire: "DS4.SpellGroupFire",
    healing: "DS4.SpellGroupHealing",
    light: "DS4.SpellGroupLight",
    air: "DS4.SpellGroupAir",
    transport: "DS4.SpellGroupTransport",
    damage: "DS4.SpellGroupDamage",
    shadow: "DS4.SpellGroupShadow",
    protection: "DS4.SpellGroupProtection",
    mindAffecting: "DS4.SpellGroupMindAffecting",
    demonology: "DS4.SpellGroupDemonology",
    necromancy: "DS4.SpellGroupNecromancy",
    transmutation: "DS4.SpellGroupTransmutation",
    area: "DS4.SpellGroupArea",
  },

  cooldownDurations: {
    "0r": "DS4.CooldownDuration0R",
    "1r": "DS4.CooldownDuration1R",
    "2r": "DS4.CooldownDuration2R",
    "5r": "DS4.CooldownDuration5R",
    "10r": "DS4.CooldownDuration10R",
    "100r": "DS4.CooldownDuration100R",
    "1d": "DS4.CooldownDuration1D",
    d20d: "DS4.CooldownDurationD20D",
  },

  /**
   * Define the set of actor types
   */
  actorTypes: {
    character: "DS4.ActorTypeCharacter",
    creature: "DS4.ActorTypeCreature",
  },

  /**
   * Define the set of attributes an actor has
   */
  attributes: {
    body: "DS4.AttributeBody",
    mobility: "DS4.AttributeMobility",
    mind: "DS4.AttributeMind",
  },

  /**
   * Define the set of traits an actor has
   */
  traits: {
    strength: "DS4.TraitStrength",
    agility: "DS4.TraitAgility",
    intellect: "DS4.TraitIntellect",
    constitution: "DS4.TraitConstitution",
    dexterity: "DS4.TraitDexterity",
    aura: "DS4.TraitAura",
  },

  /**
   * Define the set of combat values an actor has
   */
  combatValues: {
    hitPoints: "DS4.CombatValuesHitPoints",
    defense: "DS4.CombatValuesDefense",
    initiative: "DS4.CombatValuesInitiative",
    movement: "DS4.CombatValuesMovement",
    meleeAttack: "DS4.CombatValuesMeleeAttack",
    rangedAttack: "DS4.CombatValuesRangedAttack",
    spellcasting: "DS4.CombatValuesSpellcasting",
    targetedSpellcasting: "DS4.CombatValuesTargetedSpellcasting",
  },

  /**
   * The what do display in the actor sheets for the combat value text (in some languages, abbreviations are necessary)
   */
  combatValuesSheet: {
    hitPoints: "DS4.CombatValuesHitPointsSheet",
    defense: "DS4.CombatValuesDefenseSheet",
    initiative: "DS4.CombatValuesInitiativeSheet",
    movement: "DS4.CombatValuesMovementSheet",
    meleeAttack: "DS4.CombatValuesMeleeAttackSheet",
    rangedAttack: "DS4.CombatValuesRangedAttackSheet",
    spellcasting: "DS4.CombatValuesSpellcastingSheet",
    targetedSpellcasting: "DS4.CombatValuesTargetedSpellcastingSheet",
  },

  /**
   * Define the base info of a character
   */
  characterBaseInfo: {
    race: "DS4.CharacterBaseInfoRace",
    class: "DS4.CharacterBaseInfoClass",
    heroClass: "DS4.CharacterBaseInfoHeroClass",
    culture: "DS4.CharacterBaseInfoCulture",
  },

  /**
   * Define the progression info of a character
   */
  characterProgression: {
    level: "DS4.CharacterProgressionLevel",
    experiencePoints: "DS4.CharacterProgressionExperiencePoints",
    talentPoints: "DS4.CharacterProgressionTalentPoints",
    progressPoints: "DS4.CharacterProgressionProgressPoints",
  },

  /**
   * Define the language info of a character
   */
  characterLanguage: {
    languages: "DS4.CharacterLanguageLanguages",
    alphabets: "DS4.CharacterLanguageAlphabets",
  },

  /**
   * Define the profile info of a character
   */
  characterProfile: {
    biography: "DS4.CharacterProfileBiography",
    gender: "DS4.CharacterProfileGender",
    birthday: "DS4.CharacterProfileBirthday",
    birthplace: "DS4.CharacterProfileBirthplace",
    age: "DS4.CharacterProfileAge",
    height: "DS4.CharacterProfileHeight",
    hairColor: "DS4.CharacterProfileHairColor",
    weight: "DS4.CharacterProfileWeight",
    eyeColor: "DS4.CharacterProfileEyeColor",
    specialCharacteristics: "DS4.CharacterProfileSpecialCharacteristics",
  },
  /**
   * Define currency elements of a character
   */
  characterCurrency: {
    gold: "DS4.CharacterCurrencyGold",
    silver: "DS4.CharacterCurrencySilver",
    copper: "DS4.CharacterCurrencyCopper",
  },

  /**
   * Define the different creature types a creature can be
   */
  creatureTypes: {
    animal: "DS4.CreatureTypeAnimal",
    construct: "DS4.CreatureTypeConstruct",
    humanoid: "DS4.CreatureTypeHumanoid",
    magicalEntity: "DS4.CreatureTypeMagicalEntity",
    plantBeing: "DS4.CreatureTypePlantBeing",
    undead: "DS4.CreatureTypeUndead",
  },

  /**
   * Define the different size categories creatures fall into
   */
  creatureSizeCategories: {
    tiny: "DS4.CreatureSizeCategoryTiny",
    small: "DS4.CreatureSizeCategorySmall",
    normal: "DS4.CreatureSizeCategoryNormal",
    large: "DS4.CreatureSizeCategoryLarge",
    huge: "DS4.CreatureSizeCategoryHuge",
    colossal: "DS4.CreatureSizeCategoryColossal",
  },

  /**
   * Define the base info of a creature
   */
  creatureBaseInfo: {
    loot: "DS4.CreatureBaseInfoLoot",
    foeFactor: "DS4.CreatureBaseInfoFoeFactor",
    creatureType: "DS4.CreatureBaseInfoCreatureType",
    sizeCategory: "DS4.CreatureBaseInfoSizeCategory",
    experiencePoints: "DS4.CreatureBaseInfoExperiencePoints",
    description: "DS4.CreatureBaseInfoDescription",
  },

  /**
   * Define translations for available distance units
   */
  distanceUnits: {
    meter: "DS4.UnitMeters",
    kilometer: "DS4.UnitKilometers",
    custom: "DS4.UnitCustom",
  },
  /**
   * Define abbreviations for available distance units
   */
  distanceUnitsAbbr: {
    meter: "DS4.UnitMetersAbbr",
    kilometer: "DS4.UnitKilometersAbbr",
    custom: "DS4.UnitCustomAbbr",
  },

  /**
   * Define translations for available duration units
   */
  temporalUnits: {
    rounds: "DS4.UnitRounds",
    minutes: "DS4.UnitMinutes",
    hours: "DS4.UnitHours",
    days: "DS4.UnitDays",
    custom: "DS4.UnitCustom",
  },

  /**
   * Define abbreviations for available duration units
   */
  temporalUnitsAbbr: {
    rounds: "DS4.UnitRoundsAbbr",
    minutes: "DS4.UnitMinutesAbbr",
    hours: "DS4.UnitHoursAbbr",
    days: "DS4.UnitDaysAbbr",
    custom: "DS4.UnitCustomAbbr",
  },

  checks: {
    appraise: "DS4.ChecksAppraise",
    changeSpell: "DS4.ChecksChangeSpell",
    climb: "DS4.ChecksClimb",
    communicate: "DS4.ChecksCommunicate",
    decipherScript: "DS4.ChecksDecipherScript",
    defend: "DS4.ChecksDefend",
    defyPoison: "DS4.ChecksDefyPoison",
    disableTraps: "DS4.ChecksDisableTraps",
    featOfStrength: "DS4.ChecksFeatOfStrength",
    flirt: "DS4.ChecksFlirt",
    haggle: "DS4.ChecksHaggle",
    hide: "DS4.ChecksHide",
    identifyMagic: "DS4.ChecksIdentifyMagic",
    jump: "DS4.ChecksJump",
    knowledge: "DS4.ChecksKnowledge",
    openLock: "DS4.ChecksOpenLock",
    perception: "DS4.ChecksPerception",
    pickPocket: "DS4.ChecksPickPocket",
    readTracks: "DS4.ChecksReadTracks",
    resistDisease: "DS4.ChecksResistDisease",
    ride: "DS4.ChecksRide",
    search: "DS4.ChecksSearch",
    senseMagic: "DS4.ChecksSenseMagic",
    sneak: "DS4.ChecksSneak",
    startFire: "DS4.ChecksStartFire",
    swim: "DS4.ChecksSwim",
    wakeUp: "DS4.ChecksWakeUp",
    workMechanism: "DS4.ChecksWorkMechanism",
  },

  /**
   * Translations for the standard check modifiers
   */
  checkModifiers: {
    routine: "DS4.CheckModifierRoutine",
    veryEasy: "DS4.CheckModifierVeryEasy",
    easy: "DS4.CheckModifierEasy",
    normal: "DS4.CheckModifierMormal",
    difficult: "DS4.CheckModifierDifficult",
    veryDifficult: "DS4.CheckModifierVeryDifficult",
    extremelyDifficult: "DS4.CheckModifierExtremelyDifficult",
    custom: "DS4.CheckModifierCustom",
  },
};

export const DS4 = {
  // ASCII Artwork
  ASCII: String.raw`_____________________________________________________________________________________________
 ____  _   _ _   _  ____ _____ ___  _   _ ____  _        _ __   _______ ____  ____    _  _
|  _ \| | | | \ | |/ ___| ____/ _ \| \ | / ___|| |      / \\ \ / / ____|  _ \/ ___|  | || |
| | | | | | |  \| | |  _|  _|| | | |  \| \___ \| |     / _ \\ V /|  _| | |_) \___ \  | || |_
| |_| | |_| | |\  | |_| | |__| |_| | |\  |___) | |___ / ___ \| | | |___|  _ < ___) | |__   _|
|____/ \___/|_| \_|\____|_____\___/|_| \_|____/|_____/_/   \_\_| |_____|_| \_\____/     |_|
=============================================================================================`,

  /**
   * A dictionary of dictionaries each mapping keys to localized strings
   * resp. their localization keys.
   * The localization is assumed to take place on each reload.
   */
  i18n: i18nKeys,

  /**
   * A dictionary of dictionaries each mapping keys to localizion keys.
   */
  i18nKeys,

  /**
   * A dictionary of dictionaries mapping keys to icon file paths.
   */
  icons: {
    /**
     * Define the file paths to icon images
     */
    attackTypes: {
      melee: "systems/ds4/assets/icons/official/combat-values/melee-attack.png",
      meleeRanged: "systems/ds4/assets/icons/official/combat-values/melee-ranged-attack.png",
      ranged: "systems/ds4/assets/icons/official/combat-values/ranged-attack.png",
    },

    /**
     * Define the file paths to icon images
     */
    spellTypes: {
      spellcasting: "systems/ds4/assets/icons/official/combat-values/spellcasting.png",
      targetedSpellcasting: "systems/ds4/assets/icons/official/combat-values/targeted-spellcasting.png",
    },

    /**
     * Define the file paths to check images
     */
    checks: {
      appraise: "systems/ds4/assets/icons/game-icons/delapouite/two-coins.svg",
      changeSpell: "systems/ds4/assets/icons/game-icons/delapouite/card-exchange.svg",
      climb: "systems/ds4/assets/icons/game-icons/caro-asercion/mountain-climbing.svg",
      communicate: "systems/ds4/assets/icons/game-icons/delapouite/discussion.svg",
      decipherScript: "systems/ds4/assets/icons/game-icons/lorc/rune-stone.svg",
      defend: "systems/ds4/assets/icons/game-icons/sbed/shield.svg",
      defyPoison: "systems/ds4/assets/icons/game-icons/lorc/poison-bottle.svg",
      disableTraps: "systems/ds4/assets/icons/game-icons/lorc/wolf-trap.svg",
      featOfStrength: "systems/ds4/assets/icons/game-icons/delapouite/biceps.svg",
      flirt: "systems/ds4/assets/icons/game-icons/lorc/charm.svg",
      haggle: "systems/ds4/assets/icons/game-icons/lorc/cash.svg",
      hide: "systems/ds4/assets/icons/game-icons/lorc/hidden.svg",
      identifyMagic: "systems/ds4/assets/icons/game-icons/lorc/uncertainty.svg",
      jump: "systems/ds4/assets/icons/game-icons/delapouite/jump-across.svg",
      knowledge: "systems/ds4/assets/icons/game-icons/delapouite/bookshelf.svg",
      openLock: "systems/ds4/assets/icons/game-icons/delapouite/padlock-open.svg",
      perception: "systems/ds4/assets/icons/game-icons/lorc/awareness.svg",
      pickPocket: "systems/ds4/assets/icons/game-icons/darkzaitev/robber-hand.svg",
      readTracks: "systems/ds4/assets/icons/game-icons/delapouite/deer-track.svg",
      resistDisease: "systems/ds4/assets/icons/game-icons/lorc/virus.svg",
      ride: "systems/ds4/assets/icons/game-icons/delapouite/cavalry.svg",
      search: "systems/ds4/assets/icons/game-icons/lorc/magnifying-glass.svg",
      senseMagic: "systems/ds4/assets/icons/game-icons/delapouite/sparkles.svg",
      sneak: "systems/ds4/assets/icons/game-icons/delapouite/mute.svg",
      startFire: "systems/ds4/assets/icons/game-icons/lorc/campfire.svg",
      swim: "systems/ds4/assets/icons/game-icons/delapouite/pool-dive.svg",
      wakeUp: "systems/ds4/assets/icons/game-icons/delapouite/alarm-clock.svg",
      workMechanism: "systems/ds4/assets/icons/game-icons/lorc/lever.svg",
    },
  },

  /**
   * Profile info types for handlebars of a character
   */
  characterProfileDTypes: {
    biography: "String",
    gender: "String",
    birthday: "String",
    birthplace: "String",
    age: "Number",
    height: "Number",
    hairColor: "String",
    weight: "Number",
    eyeColor: "String",
    specialCharacteristics: "String",
  },

  /**
   * Standard check modifiers
   */
  checkModifiers: {
    routine: 8,
    veryEasy: 4,
    easy: 2,
    normal: 0,
    difficult: -2,
    veryDifficult: -4,
    extremelyDifficult: -8,
  },
};
