import { HtmlUtility } from "../html-utility.js";
import { RdDUtility } from "../rdd-utility.js";
import { ChatVente } from "./chat-vente.js";

export class DialogItemVente extends Dialog {

  static async display({ item, quantiteMax = undefined }) {
    const quantite = quantiteMax ?? item.getQuantite() ?? 1;
    const venteData = {
      item: item,
      alias: item.actor?.name ?? game.user.name,
      vendeurId: item.actor?.id,
      prixOrigine: item.calculerPrixCommercant(),
      prixUnitaire: item.calculerPrixCommercant(),
      prixLot: item.calculerPrixCommercant(),
      tailleLot: 1,
      nbLots: quantite,
      maxLots: quantite,
      quantiteMax: quantite,
      quantiteIllimite: item.isItemCommerce() ? quantiteMax == undefined : !item.parent,
      isOwned:  item.parent,
    }
    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-vente.html`, venteData);
    return new DialogItemVente(venteData, html).render(true);
  }

  constructor(venteData, html) {
    let options = { classes: ["dialogvente"], width: 400, height: 'fit-content', 'z-index': 99999 };

    let conf = {
      title: "Proposer",
      content: html,
      default: "proposer",
      buttons: { "proposer": { label: "Proposer", callback: it => { this.onProposer(it); } } }
    };

    super(conf, options);
    this.venteData = venteData;
  }

  activateListeners(html) {
    super.activateListeners(html);

    this.html = html;
    this.html.find(".tailleLot").change(event => this.setTailleLot(Number(event.currentTarget.value)));
    this.html.find(".nbLots").change(event => this.setNbLots(Number(event.currentTarget.value)));
    this.html.find(".quantiteIllimite").change(event => this.setQuantiteIllimite(event.currentTarget.checked));
    this.html.find(".prixLot").change(event => this.setPrixLot(Number(event.currentTarget.value)));

    this.setQuantiteIllimite(this.venteData.quantiteIllimite);
  }

  async onProposer(it) {
    this.updateVente(this.getChoixVente());

    this.venteData["properties"] = this.venteData.item.getProprietes();
    if (this.venteData.isOwned) {
      if (this.venteData.nbLots * this.venteData.tailleLot > this.venteData.quantiteMax) {
        ui.notifications.warn(`Vous avez ${this.venteData.quantiteMax} ${this.venteData.item.name}, ce n'est pas suffisant pour vendre ${this.venteData.nbLots} de ${this.venteData.tailleLot}`)
        return;
      }
    }
    await ChatVente.displayAchatVente(this.venteData)
  }

  updateVente(update) {
    foundry.utils.mergeObject(this.venteData, update);
  }

  getChoixVente() {
    return {
      nbLots: Number(this.html.find(".nbLots").val()),
      tailleLot: Number(this.html.find(".tailleLot").val()),
      quantiteIllimite: this.html.find(".quantiteIllimite").is(':checked'),
      prixLot: Number(this.html.find(".prixLot").val())
    };
  }

  /* -------------------------------------------- */
  setPrixLot(prixLot) {
    this.venteData.prixLot = prixLot;
  }

  setTailleLot(tailleLot) {
    const maxLots = Math.floor(this.venteData.quantiteMax / tailleLot);
    this.updateVente({
      tailleLot,
      nbLots: Math.min(maxLots, this.venteData.nbLots),
      maxLots: maxLots,
      prixLot: (tailleLot * this.venteData.prixOrigine).toFixed(2)
    });

    this.html.find(".prixLot").val(this.venteData.prixLot);
    this.html.find(".nbLots").val(this.venteData.nbLots);
    this.html.find(".nbLots").attr("max", this.venteData.maxLots)
  }

  setNbLots(nbLots) {
    this.updateVente({
      nbLots: this.venteData.isOwned ? Math.max(0, Math.min(nbLots, this.venteData.maxLots)) : nbLots
    })
    this.html.find(".nbLots").val(this.venteData.nbLots);
  }

  setQuantiteIllimite(checked) {
    this.updateVente({ quantiteIllimite: checked })
    this.html.find(".label-quantiteIllimite").text(this.venteData.quantiteIllimite ? "Illimités" : "disponibles");
    HtmlUtility.showControlWhen(this.html.find(".nbLots"), !this.venteData.quantiteIllimite)
  }
}