import { YggdrasillUtility } from "./yggdrasill-utility.js";
const dureeGaldrSD = { "1d5a": 3, "1d10t": 6, "1d10m": 9, "1d10h": 12, "1d5j": 15};
const ciblesGaldrSD = { "1": 3, "2_4": 6, "5_9": 9, "10_49": 12, "50plus": 15};
const zonesciblesGaldrSD = { "INS10cm3": 3, "INS50cm3": 6, "INS1m3": 9, "INS5m3": 12, "INS10m3": 15};

export class YggdrasillRoll extends Dialog {

  /* -------------------------------------------- */
  static async create(actor, rollData ) {

    let html
    let h = 440;
    if ( rollData.mode == "competence") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-competence.html', rollData);
      h = 340;
    } else if (rollData.mode == "carac") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-carac.html', rollData);
      h = 320;
    } else if (rollData.mode == "attribut") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-attribut.html', rollData);
      h = 320;
    } else if (rollData.mode == "armecc") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armecc.html', rollData);
    } else if (rollData.mode == "sejdr") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-sejdr.html', rollData);
    } else if (rollData.mode == "rune") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-rune.html', rollData);
    } else if (rollData.mode == "galdr") {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-galdr.html', rollData);
    } else {
      html = await renderTemplate('systems/fvtt-yggdrasill/templates/roll-dialog-armetir.html', rollData);
    }
    let options = { classes: ["yggdrasilldialog"], width: 600, height: h, 'z-index': 99999 };
    return new YggdrasillRoll(actor, rollData, html, options );
  }

  /* -------------------------------------------- */
  constructor(actor, rollData, html, options, close = undefined) {
    let conf = {
      title: (rollData.mode == "competence") ? "Compétence" : "Caractéristique",
      content: html,
      buttons: { 
        roll: {
            icon: '<i class="fas fa-check"></i>',
            label: "Lancer le Test",
            callback: () => { this.roll() } 
          },
          cancel: {
            icon: '<i class="fas fa-times"></i>',
            label: "Annuler",
            callback: () => { this.close() }
        } },
      default: "Roll",
      close: close
    }

    super(conf, options);

    this.actor = actor;
    this.rollData = rollData;
  }

  /* -------------------------------------------- */
  roll () {
    if ( this.rollData.mode == "attribut") {
      YggdrasillUtility.rollAttribute(this.rollData)
    } else {
      YggdrasillUtility.rollYggdrasill( this.rollData )
    }
  }
  
  /* -------------------------------------------- */
  updateGaldrSR( ) {
    let sdDuree = Number(dureeGaldrSD[this.rollData.dureeGaldr]);
    let sdVar = 0;
    if ( this.rollData.sort.data.voie == "illusion") {
      sdVar = Number(zonesciblesGaldrSD[this.rollData.zoneGaldr]);
    } else {
      sdVar = Number(ciblesGaldrSD[this.rollData.nbCibles]);
    }
    let SR = Number(this.rollData.sort.data.sd) + sdDuree + sdVar;
    $("#srTotal").text(SR);
    this.rollData.sr = SR;
  }

  /* -------------------------------------------- */
  updateRuneSR() {
    let support = 0;

    this.rollData.dureeRune = 6 - this.rollData.agiliteCarac.value;
    if ( this.rollData.supportRune == "peau") { 
      support = 3;
      this.rollData.echelleDuree = "Actions";
      this.rollData.echelleDureeVie = "Heures"
    }
    if ( this.rollData.supportRune == "tissu") { 
      support = 6;
      this.rollData.echelleDuree = "Tours";
      this.rollData.echelleDureeVie = "Jours"
    }
    if ( this.rollData.supportRune == "cuir") {
      support = 9;
      this.rollData.echelleDuree = "Minutes";
      this.rollData.echelleDureeVie = "Semaines"
    }
    if ( this.rollData.supportRune == "bois") {
      support = 12;
      this.rollData.echelleDuree = "Heures";
      this.rollData.echelleDureeVie = "Mois"
    }
    if ( this.rollData.supportRune == "pierremetal") {
      support = 15;
      this.rollData.echelleDuree = "Jours";
      this.rollData.echelleDureeVie = "Années"
    }
    let SR = this.rollData.puissanceRune + (Number(this.rollData.sort.data.niveau)*3) + support;
    $("#srTotal").text(SR);
    $("#runeDuree").text( this.rollData.dureeRune + " " + this.rollData.echelleDuree);
    $("#runeDureeVie").text( this.rollData.competence.data.niveau + " " + this.rollData.echelleDureeVie);
    this.rollData.sr = SR;
  }

  /* -------------------------------------------- */
  activateListeners(html) {
    super.activateListeners(html);

    var dialog = this;
    function onLoad() {
      if (dialog.rollData.mode == "competence") {
        let carac = dialog.actor.getCarac( "Puissance" );
        dialog.rollData.selectedCarac = carac;
      } else if (dialog.rollData.mode == "armecc" || dialog.rollData.mode == "armedist" ) {
        $("#caracName").text(dialog.rollData.selectedCarac.label);
        $("#attackDescr").text(dialog.rollData.attackDef.description);
      } else if ( dialog.rollData.mode == "sejdr" || dialog.rollData.mode == "rune" || dialog.rollData.mode == "galdr" ) {
        $("#caracName").text(dialog.rollData.selectedCarac.label);
      }
      if (dialog.rollData.mode == "rune" ) {
        dialog.updateRuneSR();
      }
      if (dialog.rollData.mode == "galdr" ) {
        dialog.updateGaldrSR();
      }
      if (dialog.rollData.mode == "attribut") {
        $("#attrValue").text("2d10+"+dialog.rollData.subAttr.value);
      } else {
        $("#caracValue").text(dialog.rollData.selectedCarac.value+"d10");
      }
    }
    $(function () { onLoad(); });

    html.find('#caracName').change((event) => {
      let caracKey = event.currentTarget.value;
      let carac = this.actor.getCarac( caracKey );
      this.rollData.selectedCarac = carac;
      $("#caracValue").text(carac.value+"d10");
    });

    html.find('#typeAttack').change((event) => {      
      let attackType = event.currentTarget.value;
      let attackDef
      if ( this.rollData.mode == 'armecc') 
        attackDef = this.actor.getAttaqueData( attackType);
      else 
        attackDef = this.actor.getTirData( attackType);
      this.rollData.attackDef = attackDef;
      this.rollData.selectedCarac = attackDef.carac;
      $("#caracValue").text(attackDef.carac.value+"d10");
      $("#caracName").text(attackDef.carac.label);
      $("#attackDescr").text(attackDef.description);
      $("#malus").text(attackDef.malus);
    });

    html.find('#supportRune').change((event) => {
      this.rollData.supportRune = event.currentTarget.value;
      this.updateRuneSR();
    });
    html.find('#puissanceRune').change((event) => {
      this.rollData.puissanceRune = Number(event.currentTarget.value);
      this.updateRuneSR();
    });

    html.find('#dureeGaldr').change((event) => {
      this.rollData.dureeGaldr = event.currentTarget.value;
      this.updateGaldrSR();
    });
    html.find('#nbCibles').change((event) => {
      this.rollData.nbCibles = event.currentTarget.value;
      this.updateGaldrSR();
    });
    html.find('#zoneGaldr').change((event) => {
      this.rollData.zoneGaldr = event.currentTarget.value;
      this.updateGaldrSR();
    });
    
    
    html.find('#bonusMalus').change((event) => {
      this.rollData.bonusMalus = Number(event.currentTarget.value);
    });
    html.find('#furorUsage').change((event) => {
      this.rollData.furorUsage = Number(event.currentTarget.value);
    });
    html.find('#sr').change((event) => {
      this.rollData.sr = Number(event.currentTarget.value);
    });
    html.find('#bonusdefense').change((event) => {
      this.rollData.bonusdefense = Number(event.currentTarget.value);
    });

  }
  
}