import { Misc } from "./misc.js";
import { RdDUtility } from "./rdd-utility.js";

export class DialogFabriquerPotion extends Dialog {

  /* -------------------------------------------- */
  static async create(actor, item) {
    const brinsMinimum = DialogFabriquerPotion.nombreBrinsMinimum(item)
    if (item.system.quantite < brinsMinimum) {
      ui.notifications.warn(`Vous avez ${item.system.quantite} brins de ${item.name}, il en faut au moins ${brinsMinimum} pour faire une potion!`)
      return
    }
    const potionData = DialogFabriquerPotion.prepareData(item, brinsMinimum)
    const options = { classes: ["dialogfabriquerpotion"], width: 600, height: 160, 'z-index': 99999 }
    const html = await renderTemplate('systems/foundryvtt-reve-de-dragon/templates/dialog-fabriquer-potion-base.hbs', potionData)

    new DialogFabriquerPotion(actor, potionData, html, options).render(true)
  }

  /* -------------------------------------------- */
  static prepareData(item, brinsMinimum) {
    const brinsOptimal = DialogFabriquerPotion.nombreBrinsOptimal(item)
    return foundry.utils.mergeObject(foundry.utils.duplicate(item), {
      nbBrinsSelect: RdDUtility.buildListOptions(brinsMinimum, brinsOptimal),
      nbBrins: Math.min(item.system.quantite, brinsOptimal),
      herbebonus: item.system.niveau
    })
  }

  /* -------------------------------------------- */
  constructor(actor, potionData, html, options) {
    const conf = {
      title: `Fabriquer une potion de ${potionData.system.categorie}`,
      content: html,
      default: 'fabriquer',
      buttons: {
        'fabriquer': { label: "Fabriquer", callback: it => this.onFabriquer() }
      }
    }
    super(conf, options)

    this.actor = actor
    this.potionData = potionData
  }

  /* -------------------------------------------- */
  activateListeners(html) {
    super.activateListeners(html)
    this.html = html
    this.html.find("[name='nbBrins']").change(event => {
      this.potionData.nbBrins = Misc.toInt(event.currentTarget.value)
      const brinsManquants = Math.max(0, DialogFabriquerPotion.nombreBrinsOptimal(this.potionData) - this.potionData.nbBrins)
      this.potionData.herbebonus = Math.max(0, this.potionData.system.niveau - brinsManquants)
    })
  }

  /* -------------------------------------------- */
  async onFabriquer() {
    await this.html.find("[name='nbBrins']").change()
    await this.actor.fabriquerPotion(this.potionData)
    this.close()
  }

  static nombreBrinsMinimum(herbeData) {
    switch (herbeData.system.categorie ?? '') {
      case "Soin": return 1 + Math.max(0, 12 - 2 * herbeData.system.niveau)
      case "Repos": return 1 + Math.max(0, 7 - 2 * herbeData.system.niveau)
    }
    return 1
  }

  static nombreBrinsOptimal(herbeData) {
    switch (herbeData.system.categorie ?? '') {
      case "Soin": return 12 - herbeData.system.niveau
      case "Repos": return 7 - herbeData.system.niveau
    }
    return 1
  }
}