function createBundledSkill({
  name,
  description,
  linkedCharacteristic = "puissance",
  rollModifier = 0,
  isRollable = true,
  grade = 1,
  skillPointCost = 1,
  skillType = "path"
}) {
  return {
    name,
    description,
    linkedCharacteristic,
    rollModifier,
    isRollable,
    grade,
    skillPointCost,
    skillType
  };
}

function createPathDefinition({ name, category, description, skills }) {
  return { name, category, description, skills };
}

function slugify(value) {
  return String(value ?? "")
    .normalize("NFD")
    .replace(/[\u0300-\u036f]/g, "")
    .toLowerCase()
    .replace(/[^a-z0-9]+/g, "-")
    .replace(/^-+|-+$/g, "")
    .slice(0, 50);
}

const PATH_DEFINITIONS = [
  createPathDefinition({
    name: "Voie du guerrier",
    category: "Voies martiales",
    description: "Vous maîtrisez les armes, la présence militaire et la défense disciplinée.",
    skills: [
      createBundledSkill({
        name: "Maîtrise martiale",
        description: "Vous maîtrisez toutes les armes ainsi que votre corps : +10 en Corps sur toute action martiale.",
        linkedCharacteristic: "puissance",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Présence imposante",
        description: "Vous en imposez : +10 sur toute action visant à intimider ou à inspirer le courage.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Maître de la défense",
        description: "Vous pouvez vous défendre gratuitement une fois par tour.",
        linkedCharacteristic: "coordination",
        isRollable: false
      }),
      createBundledSkill({
        name: "Barda du soldat",
        description: "Vous pouvez porter sans problème de l’équipement lourd sur de longues distances et avez un bonus de +10 pour soulever des objets lourds.",
        linkedCharacteristic: "puissance",
        rollModifier: 10
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du berserker",
    category: "Voies martiales",
    description: "Une voie brutale fondée sur la rage, la survie et l’acharnement au combat.",
    skills: [
      createBundledSkill({
        name: "Arme de prédilection",
        description: "Vous maîtrisez une arme de votre choix : +15 avec cette arme pour attaquer.",
        linkedCharacteristic: "coordination",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Rage",
        description: "Vous pouvez passer en rage pour un point d'action. Si vous le faites vous perdez 1 point de vie par point d'action, vous gagnez 3 points d'action maximum et au prochain tour vous devez choisir une posture offensive. Vos attaques subissent un modificateur de -10.",
        linkedCharacteristic: "puissance",
        isRollable: false
      }),
      createBundledSkill({
        name: "Immortel",
        description: "Lorsque vous passez en PV négatifs, et chaque tour suivant jusqu'à ce que vos PV reviennent à 0 ou plus, vous pouvez dépenser un point de magie ou faire un jet de magie sans bonus pour tromper la mort.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du moine",
    category: "Voies martiales",
    description: "Une discipline du corps qui mêle arts martiaux, redirection et vitesse.",
    skills: [
      createBundledSkill({
        name: "Corps létal",
        description: "Votre corps est une machine létale et vous pouvez utiliser n'importe quelle arme : +10 en Corps sur toute action martiale et jets d'arts martiaux.",
        linkedCharacteristic: "coordination",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Flux martial",
        description: "Vous pouvez utiliser l'action Redirection pour vous défendre. Si vous réussissez un jet d'art martial vous pouvez rediriger une attaque de mêlée vers une créature à votre mêlée et une attaque à distance vers une créature à courte portée. Si l'attaque est magique, vous devez d'abord payer autant de points magiques que le coût de l'attaque en question ou réussir autant de jets d'arts martiaux en plus de celui pour rediriger l'attaque.",
        linkedCharacteristic: "coordination"
      }),
      createBundledSkill({
        name: "Initiative améliorée",
        description: "Vous avez +15 à l'initiative.",
        linkedCharacteristic: "coordination",
        rollModifier: 15,
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie de la Garde Impériale",
    category: "Voies martiales",
    description: "Une voie défensive centrée sur la loyauté, la discipline et la lance.",
    skills: [
      createBundledSkill({
        name: "Gardien loyal",
        description: "Vous êtes un gardien loyal et protecteur : +15 en Corps sur toute action de défense, +10 en Mental pour les jets de Perception.",
        linkedCharacteristic: "coordination",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Sens de la discipline",
        description: "Une fois par jour par niveau de voie vous pouvez ignorer une réussite de vous soudoyer, un ordre qui ne vous est pas donné par votre employeur ou toute autre action sociale et mentale à votre égard. Vous êtes immunisé à cet effet jusqu'à la fin de la scène.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Spécialiste de la lance",
        description: "Vous êtes particulièrement efficace avec une lance, vous pouvez effectuer des manœuvres complexes avec et avez +15 à votre maniement.",
        linkedCharacteristic: "coordination",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Brise-garde",
        description: "Vous pouvez dépenser un point d'action pour briser la garde d'un adversaire, réduisant sa SOAK de moitié jusqu'au prochain tour. Cette capacité nécessite une lance ou d'être à mains nues.",
        linkedCharacteristic: "puissance",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du saltimbanque",
    category: "Voies techniques",
    description: "Une voie d’agilité spectaculaire fondée sur l’esquive et l’acrobatie.",
    skills: [
      createBundledSkill({
        name: "Maîtrise du corps et des réflexes",
        description: "Vous maîtrisez votre corps et vos réflexes : +15 aux Réflexes pour Esquiver et aux Acrobaties, et +15 au Corps pour Athlétisme.",
        linkedCharacteristic: "coordination",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Esquive mobile",
        description: "Lorsque vous réussissez une Esquive, vous pouvez décider de prendre malgré tout la moitié des dommages. Si vous le faites, vous pouvez immédiatement vous déplacer d'une portée dans n'importe quelle direction.",
        linkedCharacteristic: "coordination",
        isRollable: false
      }),
      createBundledSkill({
        name: "Esquive surnaturelle",
        description: "Vous pouvez dépenser un point de magie ou faire un jet de magie pour esquiver un coup normalement impossible à esquiver.",
        linkedCharacteristic: "coordination",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du discoureur",
    category: "Voies techniques",
    description: "Une voie sociale qui manipule, humilie et retourne les esprits.",
    skills: [
      createBundledSkill({
        name: "Langue acérée",
        description: "Votre langue est aiguisée comme une épée et blesse plus que la plus fine des lames : +15 en Mental pour baratiner et +15 en Intellect pour se souvenir.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Le ridicule ne tue pas",
        description: "Réussit automatiquement à se faire passer pour plus misérable qu’il n’est ou que son interlocuteur, et obtient un +15 pour se faire passer pour meilleur qu'il ne l'est.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15,
        isRollable: false
      }),
      createBundledSkill({
        name: "Créer la discorde",
        description: "Capable de créer la discorde dans l’esprit des autres. Doit dépenser un point de magie.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie de l'instrumentiste",
    category: "Voies techniques",
    description: "Une voie artistique qui soigne, combat et performe par la musique.",
    skills: [
      createBundledSkill({
        name: "Instrumentiste de combat",
        description: "+15 en Mental sur Représentation et +15 en attaque lorsqu’il utilise un instrument comme arme.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Regard distrait",
        description: "-10 en Intellect pour les jets de Perception.",
        linkedCharacteristic: "ingeniosite",
        rollModifier: -10,
        isRollable: false
      }),
      createBundledSkill({
        name: "Sacrifice lyrique",
        description: "Vous pouvez dépenser un point de vie et une action pour jouer une mélodie qui rendra 1 PV à tous vos alliés.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Connaissances médicales",
        description: "Ne peut pas rater les Premiers secours et a un bonus de +15.",
        linkedCharacteristic: "ingeniosite",
        rollModifier: 15,
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie de l'Alchimiste",
    category: "Voies techniques",
    description: "Une voie de fabrication, d’expérimentation et de commerce alchimique.",
    skills: [
      createBundledSkill({
        name: "Fabrication d'élixirs",
        description: "Vous maîtrisez la fabrication d'élixirs et de poisons : +10 pour les jets de création d'élixirs et de poisons.",
        linkedCharacteristic: "ingeniosite",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Maître des potions",
        description: "Vous pouvez créer un élixir, une pilule ou un poison gratuitement une fois par jour et pouvez en créer plus en dépensant du temps et des ressources.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Immunité alchimique",
        description: "Vous êtes immunisé contre les effets de vos propres poisons et élixirs.",
        linkedCharacteristic: "puissance",
        isRollable: false
      }),
      createBundledSkill({
        name: "Artisanat alchimique",
        description: "Vous pouvez gagner de l'argent en vendant vos élixirs et poisons.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Banni",
    category: "Voies techniques",
    description: "Une voie de survie, de rancune et d'adaptation loin de la cour.",
    skills: [
      createBundledSkill({
        name: "Survie du banni",
        description: "Vous avez été banni de la cour et devez vous débrouiller seul : +10 en Corps pour la survie.",
        linkedCharacteristic: "puissance",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Maître des déguisements",
        description: "Vous pouvez changer de déguisement gratuitement une fois par jour et pouvez en changer plus en dépensant du temps pour vous y préparer.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Rancune tenace",
        description: "Vous avez un bonus de +10 pour les actions visant à vous venger d'une personne ou d'un groupe en particulier.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Négociant hors pair",
        description: "Vous avez un bonus de +10 en Mental pour les négociations.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 10
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Noble",
    category: "Voies techniques",
    description: "Une voie de prestige, de diplomatie et de réseau aristocratique.",
    skills: [
      createBundledSkill({
        name: "Éducation noble",
        description: "Vous avez été éduqué pour gouverner et diriger : +15 en Mental pour Persuader et Convaincre, +10 en Intellect pour les Connaissances Nobles.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Influence sociale",
        description: "Vous avez des contacts et une influence dans les cercles aristocratiques, et pouvez utiliser cette influence pour obtenir des informations, de l'équipement ou des services.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Diplomate-né",
        description: "Vous pouvez résoudre des conflits et obtenir des compromis même dans des situations difficiles. +15 en Mental pour les jets de négociation.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Ressources",
        description: "Vous disposez de ressources considérables, qui peuvent être utilisées pour financer des projets, acheter des biens et services ou soudoyer des fonctionnaires.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Marchand",
    category: "Voies techniques",
    description: "Une voie marchande fondée sur l'affaire, la politique et la négociation.",
    skills: [
      createBundledSkill({
        name: "Esprit d'entreprise",
        description: "+15 en Intellect pour toutes les actions liées à la négociation, la finance et les affaires.",
        linkedCharacteristic: "ingeniosite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Influence politique",
        description: "Vous avez des relations dans les cercles de pouvoir et pouvez influencer les décisions politiques. Vous avez un bonus de +10 pour persuader les autres de soutenir vos initiatives.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Marchandage",
        description: "Vous avez un talent pour le commerce et pouvez négocier des prix avantageux pour les biens et les services que vous achetez ou vendez. Vous avez un bonus de +10 pour toutes les actions liées aux transactions commerciales.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 10
      })
    ]
  }),
  createPathDefinition({
    name: "Voie de l'Érudit",
    category: "Voies magiques",
    description: "Une voie magique savante orientée vers l'étude et la tradition.",
    skills: [
      createBundledSkill({
        name: "Compétences magiques supplémentaires",
        description: "Choisissez deux compétences magiques supplémentaires.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Maîtrise magique",
        description: "Vos jets de magie se font avec un bonus de +15.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Tradition magique",
        description: "Vous devez choisir une de ces traditions : XXX XXXXXXX XXXXX.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Cultivateur de Ki",
    category: "Voies magiques",
    description: "Une voie mystique qui canalise le Ki dans le corps et les techniques surnaturelles.",
    skills: [
      createBundledSkill({
        name: "Canalisation du Ki",
        description: "Vous êtes capable de canaliser l'énergie du Ki à travers votre corps : +15 en Corps sur les jets d'arts martiaux et les actions de mouvement.",
        linkedCharacteristic: "coordination",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Contrôle du Ki",
        description: "Vous êtes capable de contrôler et de manipuler l'énergie du Ki pour obtenir des effets surnaturels, tels que la lévitation, l'invulnérabilité temporaire ou la télékinésie. Toutes ces capacités requièrent l'utilisation d'un point de ki (magie) et, si vous êtes en combat, d'un point d'action.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Lame de Ki",
        description: "Votre arme est enveloppée d'énergie de Ki, lui donnant un bonus de +10 pour attaquer et infligeant des dégâts supplémentaires de Ki.",
        linkedCharacteristic: "coordination",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Bouclier de Ki",
        description: "Vous êtes entouré d'un bouclier d'énergie de Ki, vous donnant un bonus de +10 en Corps sur toutes les actions de défense et vous protégeant des dégâts magiques.",
        linkedCharacteristic: "coordination",
        rollModifier: 10
      }),
      createBundledSkill({
        name: "Vol de Ki",
        description: "Vous êtes capable de voler en utilisant l'énergie de Ki, vous permettant de vous déplacer librement dans les airs pendant un tour entier. Les déplacements coûtent moitié, arrondi à l'inférieur.",
        linkedCharacteristic: "coordination",
        isRollable: false
      }),
      createBundledSkill({
        name: "Explosion de Ki",
        description: "Vous pouvez libérer une explosion d'énergie de Ki qui inflige des dégâts à tous les ennemis dans un rayon de 5 mètres autour de vous.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Régénération de Ki",
        description: "Vous pouvez vous soigner en utilisant l'énergie de Ki, récupérant un nombre de points de vie égal à votre score en Magie.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Attaque de Ki",
        description: "Vous êtes capable de déchaîner des attaques de Ki, infligeant des dégâts supplémentaires à vos ennemis et perturbant leur énergie de Ki.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Détenteur d'Emblème de Jade",
    category: "Voies magiques",
    description: "Une voie impériale fondée sur les emblèmes, les contrats et le contrôle magique.",
    skills: [
      createBundledSkill({
        name: "Cultivation Impériale",
        description: "+15 en Intellect pour les jets de Connaissances Magiques.",
        linkedCharacteristic: "ingeniosite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Contrôle magique",
        description: "Vous êtes capable d'utiliser les Emblèmes de Jade Guanxi pour contrôler les actions des autres et pouvez imposer des contrats magiques à vos ennemis ou vos alliés. +15.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Détection des contrats",
        description: "Vous êtes capable de détecter la présence de contrats magiques et pouvez analyser les emblèmes pour en déterminer les propriétés.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Création d'Emblèmes",
        description: "Vous êtes capable de créer des Emblèmes de Jade Guanxi et pouvez les utiliser pour obtenir des faveurs ou des services de la part d'autres détenteurs d'emblèmes. Vous pouvez en créer 1 par mois et commencez avec 2 emblèmes.",
        linkedCharacteristic: "ingeniosite",
        isRollable: false
      })
    ]
  }),
  createPathDefinition({
    name: "Voie du Shaman",
    category: "Voies magiques",
    description: "Une voie spirituelle tournée vers les esprits, les malédictions et la guérison rituelle.",
    skills: [
      createBundledSkill({
        name: "Intermédiaire des esprits",
        description: "Vous êtes un intermédiaire entre le monde des vivants et le monde des esprits : +15 en Mental pour les jets de Magie.",
        linkedCharacteristic: "perspicacite",
        rollModifier: 15
      }),
      createBundledSkill({
        name: "Pouvoir chamanique",
        description: "Vous êtes capable d'invoquer des esprits et de communiquer avec eux pour obtenir des conseils ou des faveurs.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Malédiction",
        description: "Vous êtes capable de maudire vos ennemis en utilisant des sorts de malchance ou de maladie.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      }),
      createBundledSkill({
        name: "Guérison spirituelle",
        description: "Vous êtes capable de soigner les blessures physiques et mentales en utilisant des rituels de guérison.",
        linkedCharacteristic: "perspicacite",
        isRollable: false
      })
    ]
  })
];

function toBundledSkillData(pathName, skill) {
  return {
    key: `${slugify(pathName)}-${slugify(skill.name)}`,
    name: skill.name,
    description: skill.description,
    grade: skill.grade,
    skillType: skill.skillType,
    linkedCharacteristic: skill.linkedCharacteristic,
    isRollable: skill.isRollable,
    skillPointCost: skill.skillPointCost,
    rollModifier: skill.rollModifier
  };
}

function toPathCompendiumItem(definition) {
  return {
    name: definition.name,
    type: "path",
    img: "icons/svg/upgrade.svg",
    system: {
      grade: 1,
      xpCost: 15,
      description: `${definition.category}\n${definition.description}`,
      bundledSkills: definition.skills.map(skill => toBundledSkillData(definition.name, skill))
    }
  };
}

function toSkillCompendiumItem(pathDefinition, skill) {
  return {
    name: `${pathDefinition.name} — ${skill.name}`,
    type: "skill",
    img: "icons/svg/book.svg",
    system: {
      grade: skill.grade,
      description: `${pathDefinition.name}\n${skill.description}`,
      skillType: skill.skillType,
      linkedCharacteristic: skill.linkedCharacteristic,
      isRollable: skill.isRollable,
      skillPointCost: skill.skillPointCost,
      rollModifier: skill.rollModifier,
      sourcePathId: "",
      sourcePathKey: `${slugify(pathDefinition.name)}-${slugify(skill.name)}`
    }
  };
}

export const PATH_COMPENDIUM_ITEMS = PATH_DEFINITIONS.map(toPathCompendiumItem);

export const SKILL_COMPENDIUM_ITEMS = PATH_DEFINITIONS.flatMap(pathDefinition => (
  pathDefinition.skills.map(skill => toSkillCompendiumItem(pathDefinition, skill))
));
