export class DialogChateauDormant extends Dialog {

  static async create() {
    const date = game.system.rdd.calendrier.dateCourante();
    const dialogData = {
      actors: game.actors.filter(actor => actor.isPersonnageJoueur()),
      date: date,
      motifStress: `Nuit du ${date}`,
      finChateauDormant: game.system.rdd.calendrier.getTimestampFinChateauDormant()
    };
    const html = await renderTemplate("systems/foundryvtt-reve-de-dragon/templates/sommeil/dialog-chateau-dormant.hbs",
      dialogData);

    new DialogChateauDormant(dialogData, html)
      .render(true);
  }

  constructor(dialogData, html) {
    const options = {
      classes: ["rdd-dialog-chateau-dormant"],
      width: 600,
      height: 'fit-content',
      'z-index': 99999
    };
    const conf = {
      title: "De Chateau dormant à Vaisseau",
      content: html,
      buttons: {
        chateauDormant: { label: "Passer à Vaisseau!", callback: it => { this.onChateauDormant(); } }
      }
    };
    super(conf, options);
    this.dialogData = dialogData;
  }

  activateListeners(html) {
    super.activateListeners(html);
    this.html = html;
    this.html.find('input.sommeil-insomnie').change(event => this.onInsomnie(event));
    this._activateListenerOnActorMoral(this.html);
  }

  _activateListenerOnActorMoral(html) {
    html.find(`span.sommeil-actor-moral a`).click(event => this.onActorMoral(event));
  }

  onInsomnie(event) {
    const sommeilInsomnie = this.html.find(event.currentTarget);
    const isInsomnie = sommeilInsomnie.is(':checked');
    const sommeilHeures = sommeilInsomnie.parents('.set-sommeil-actor').find('input.sommeil-heures');
    sommeilHeures.prop('disabled', isInsomnie);
    if (isInsomnie) {
      sommeilHeures.val('0');
    }
  }

  async onActorMoral(event) {
    const selected = this.html.find(event.currentTarget);
    const actorRow = selected.parents('.set-sommeil-actor');
    const actorId = actorRow.data('actor-id');
    const actor = this.getActor(actorId);
    actor.system.sommeil.moral = selected.data('moral');
    const htmlMoral = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/sommeil/sommeil-actor-moral.hbs', actor.system.sommeil)
    actorRow.find('.sommeil-actor-moral').html(htmlMoral);
    // re-attach listeners for actor row
    this._activateListenerOnActorMoral(actorRow);
  }

  getActor(actorId) {
    return this.dialogData.actors.find(it => it.id == actorId);
  }

  async onChateauDormant() {
    const motifStress = this.html.find("form input[name='motifStress']").val();
    jQuery.map(
      this.html.find('li.set-sommeil-actor'),
      it => this.extractConsigneActor(this.html.find(it), motifStress)
    ).forEach(async consigne => await consigne.actor.prepareChateauDormant(consigne))
  }


  extractConsigneActor(actorRow, motifStress) {
    const actorId = actorRow.data('actor-id');
    const actor = this.getActor(actorId);
    const insomnie = actorRow.find('input.sommeil-insomnie').is(':checked');
    return {
      actor,
      ignorer: actorRow.find('input.sommeil-ignorer').is(':checked'),
      stress: {
        motif: motifStress,
        valeur: Number.parseInt(actorRow.find('input.sommeil-stress').val()),
      },
      sommeil: {
        nouveaujour: true,
        date: this.dialogData.finChateauDormant,
        insomnie: insomnie,
        heures: insomnie ? 0 : Number.parseInt(actorRow.find('input.sommeil-heures').val()),
        moral: actor.system.sommeil.moral ?? 'neutre',
      }
    };
  }
}