import { RdDCarac } from "./rdd-carac.js";

const conditionsTactiques = [
  { type: '', descr: '', dmg: 0, attaque: 0, parade: 0, esquive: true },
  { type: 'charge', descr: 'Charge', dmg: 2, attaque: 4, parade: -4, esquive: false },
  { type: 'feinte', descr: 'Feinte', dmg: 1, attaque: 1, parade: 0, esquive: true },
  { type: 'pret', descr: 'prêt', dmg: 0, attaque: 0, parade: 0, esquive: true },
  { type: 'demi', descr: 'Demi-surprise', dmg: 1, attaque: 0, parade: 0, esquive: true },
  { type: 'totale', descr: 'Surprise totale', dmg: 10, attaque: 6, parade: 0, esquive: true },
];

/* -------------------------------------------- */
export class RdDBonus {

  /* -------------------------------------------- */
  static find(condition) {
    return conditionsTactiques.find(e => e.type == condition) || conditionsTactiques.find(e => e.type == 'pret');
  }


  static isAjustementAstrologique(rollData) {
    return RdDCarac.isChance(rollData.selectedCarac) ||
      rollData.selectedSort?.data.isrituel;
  }
  /* -------------------------------------------- */
  static isDefenseAttaqueFinesse(rollData) {
    return rollData.attackerRoll?.particuliere == 'finesse';
  }

  /* -------------------------------------------- */
  static dmg(rollData, dmgActor, isCauchemar = false) {
    let dmg = { total: 0 };
    if (rollData.arme && rollData.arme.name.toLowerCase() == "esquive") {
      // Specific case management
      ui.notifications.warn("Calcul de bonus dégats sur esquive !");
    } else {
      dmg.dmgArme = RdDBonus._dmgArme(rollData);
      dmg.penetration = RdDBonus._peneration(rollData);
      dmg.dmgTactique = RdDBonus.dmgBonus(rollData.tactique);
      dmg.dmgParticuliere = RdDBonus._dmgParticuliere(rollData);
      dmg.dmgSurprise = RdDBonus.dmgBonus(rollData.ajustements?.attaqueDefenseurSurpris.used);
      dmg.dmgActor = rollData.selectedCarac ? RdDBonus._dmgPerso(dmgActor, rollData.selectedCarac.label, dmg.dmgArme) : 0;
      dmg.total = dmg.dmgSurprise + dmg.dmgTactique + dmg.dmgArme + dmg.dmgActor + dmg.dmgParticuliere;
      dmg.mortalite = RdDBonus._calculMortalite(rollData, isCauchemar)
    }
    return dmg;
  }

  /* -------------------------------------------- */
  static description(condition) {
    return RdDBonus.find(condition).descr;
  }

  /* -------------------------------------------- */
  static dmgBonus(condition) {
    return RdDBonus.find(condition).dmg;
  }

  /* -------------------------------------------- */
  static bonusAttaque(condition) {
    return RdDBonus.find(condition).attaque;
  }

  /* -------------------------------------------- */
  static _calculMortalite(rollData, isCauchemar) {
    if (isCauchemar) {
      return "cauchemar";
    }
    return isCauchemar ? "cauchemar"
      : rollData.dmg?.mortalite
      ?? rollData.arme?.data.mortalite
      ?? "mortel";
  }

  /* -------------------------------------------- */
  static _dmgArme(rollData) {
    if ( rollData.arme) {
      let dmgBase = rollData.arme.data.dommagesReels ?? Number(rollData.arme.data.dommages ?? 0);
      //Le bonus dégats magiques ne peut pas faire dépasser le bonus de l'arme (cf p.278)
      return dmgBase + Math.min(dmgBase, rollData.arme.data.magique ? rollData.arme.data.ecaille_efficacite : 0);
    }
    return 0;
  }

  /* -------------------------------------------- */
  static _peneration(rollData) {
    return parseInt(rollData.arme?.data.penetration ?? 0);
  }

  /* -------------------------------------------- */
  static _dmgPerso(dmgActor, categorie, dmgArme) {
    switch (categorie) {
      case "Tir": return 0;
      case "Lancer": return Math.max(0, Math.min(dmgArme, dmgActor));
    }
    return dmgActor;
  }

  /* -------------------------------------------- */
  static _dmgParticuliere(rollData) {
    return rollData.particuliere == 'force' ? 5 : 0;
  }

}