import { ChatUtility } from "./chat-utility.js";
import { HtmlUtility } from "./html-utility.js";
import { RdDItemSigneDraconique } from "./item-signedraconique.js";
import { Misc } from "./misc.js";
import { TMRUtility } from "./tmr-utility.js";

export class DialogCreateSigneDraconique extends Dialog {

  static async createSigneForActors() {
    const signe = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});
    let dialogData = {
      signe: signe,
      tmrs: TMRUtility.listSelectedTMR(signe.data.typesTMR ?? []),
      actors: game.actors.filter(actor => actor.isHautRevant()).map(actor => {
        let actorData = duplicate(Misc.data(actor));
        actorData.selected = actor.hasPlayerOwner;
        return actorData;
      })
    };

    const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/dialog-create-signedraconique.html", dialogData);
    new DialogCreateSigneDraconique(dialogData, html)
      .render(true);
  }

  constructor(dialogData, html, callback) {
    let options = { classes: ["DialogCreateSigneDraconiqueActorsActors"], width: 500, height: 650, 'z-index': 99999 };
    let conf = {
      title: "Créer un signe",
      content: html,
      default: "Ajouter aux haut-rêvants",
      buttons: {
        "Ajouter aux haut-rêvants": { label: "Ajouter aux haut-rêvants", callback: it => { this._onCreerSigneActeurs(); } }
      }
    };
    super(conf, options);
    this.dialogData = dialogData;
  }

  async _onCreerSigneActeurs() {
    await $("[name='signe.data.ephemere']").change();
    await $(".signe-xp-sort").change();
    this.validerSigne();
    this.dialogData.actors.filter(it => it.selected).map(it => game.actors.get(it._id))
      .forEach(actor => this._createSigneForActor(actor, this.dialogData.signe));
  }

  async _createSigneForActor(actor, signe) {
    actor.createEmbeddedDocuments("Item", [signe]);
    ChatMessage.create({
      whisper: ChatUtility.getWhisperRecipientsAndGMs(Misc.data(actor).name),
      content: await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/chat-signe-draconique-actor.html", {
        signe: signe,
        alias: Misc.data(actor).name
      })
    });
  }

  validerSigne() {
    this.dialogData.signe.name = $("[name='signe.name']").val();
    this.dialogData.signe.data.valeur.norm = $("[name='signe.data.valeur.norm']").val();
    this.dialogData.signe.data.valeur.sign = $("[name='signe.data.valeur.sign']").val();
    this.dialogData.signe.data.valeur.part = $("[name='signe.data.valeur.part']").val();
    this.dialogData.signe.data.difficulte = $("[name='signe.data.difficulte']").val();
    this.dialogData.signe.data.ephemere = $("[name='signe.data.ephemere']").prop("checked");
    this.dialogData.signe.data.duree = $("[name='signe.data.duree']").val();
    this.dialogData.signe.data.typesTMR = $(".select-tmr").val();
  }

  /* -------------------------------------------- */
  activateListeners(html) {
    super.activateListeners(html);
    this.setEphemere(this.dialogData.signe.data.ephemere);
    html.find(".signe-aleatoire").click(event => this.setSigneAleatoire());
    html.find("[name='signe.data.ephemere']").change((event) => this.setEphemere(event.currentTarget.checked));
    html.find(".select-actor").change((event) => this.onSelectActor(event));
    html.find(".signe-xp-sort").change((event) => this.onValeurXpSort(event));
  }

  async setSigneAleatoire() {
    const newSigne = await RdDItemSigneDraconique.randomSigneDraconique({ephemere: true});

    $("[name='signe.name']").val(newSigne.name);
    $("[name='signe.data.valeur.norm']").val(newSigne.data.valeur.norm);
    $("[name='signe.data.valeur.sign']").val(newSigne.data.valeur.sign);
    $("[name='signe.data.valeur.part']").val(newSigne.data.valeur.part);
    $("[name='signe.data.difficulte']").val(newSigne.data.difficulte);
    $("[name='signe.data.duree']").val(newSigne.data.duree);
    $("[name='signe.data.ephemere']").prop("checked", newSigne.data.ephemere);
    $(".select-tmr").val(newSigne.data.typesTMR);
    this.setEphemere(newSigne.data.ephemere);
  }

  async setEphemere(ephemere) {
    this.dialogData.signe.data.ephemere = ephemere;
    HtmlUtility._showControlWhen($(".signe-data-duree"), ephemere);
  }

  async onSelectActor(event) {
    event.preventDefault();
    const options = event.currentTarget.options;
    for (var i = 0; i < options.length; i++) { // looping over the options
      const actorId = options[i].attributes["data-actor-id"].value;
      const actor = this.dialogData.actors.find(it => it._id == actorId);
      if (actor) {
        actor.selected = options[i].selected;
      }
    };
  }

  onValeurXpSort(event) {
    const codeReussite = event.currentTarget.attributes['data-typereussite']?.value ?? 0;
    const xp = Number(event.currentTarget.value);
    const oldValeur = this.dialogData.signe.data.valeur;
    this.dialogData.signe.data.valeur = RdDItemSigneDraconique.calculValeursXpSort(codeReussite, xp, oldValeur);
  }

}