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

export class DialogItemAchat extends Dialog {

  static preparerAchat(chatButton) {
    return ChatVente.getDetailAchatVente(RdDUtility.findChatMessageId(chatButton))
  }

  static async onAcheter({ item, vendeur, acheteur, tailleLot, prixLot, nbLots, quantiteIllimite, chatMessageIdVente }) {
    const venteData = {
      item,
      actingUserId: game.user.id,
      vendeur,
      acheteur,
      tailleLot,
      quantiteIllimite,
      nbLots,
      choix: { seForcer: false, supprimerSiZero: true },
      prixLot,
      isVente: prixLot > 0,
      isConsommable: item.type == 'nourritureboisson' && acheteur?.isPersonnage(),
      chatMessageIdVente
    }
    if (venteData.vendeur?.id == venteData.acheteur?.id) {
      ui.notifications.info("Inutile de se vendre à soi-même")
      return
    }

    DialogItemAchat.changeNombreLots(venteData, 1)
    const html = await renderTemplate(`systems/foundryvtt-reve-de-dragon/templates/dialog-item-achat.hbs`, venteData)
    new DialogItemAchat(html, venteData).render(true)
  }

  static changeNombreLots(venteData, nombreLots) {
    venteData.choix.nombreLots = nombreLots;
    venteData.prixTotal = (nombreLots * venteData.prixLot).toFixed(2);
    if (venteData.isConsommable) {
      const doses = nombreLots * venteData.tailleLot;
      venteData.totalSust = Misc.keepDecimals(doses * (venteData.item.system.sust ?? 0), 2);
      venteData.totalDesaltere = venteData.item.system.boisson
        ? Misc.keepDecimals(doses * (venteData.item.system.desaltere ?? 0), 2)
        : 0;
    }
  }

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

    const actionAchat = venteData.prixLot > 0 ? "Acheter" : "Prendre";
    const buttons = {};
    if (venteData.isConsommable) {
      buttons["consommer"] = { label: venteData.item.system.boisson ? "Boire" : "Manger", callback: it => this.onAchatConsommer() }
    }
    buttons[actionAchat] = { label: actionAchat, callback: it => { this.onAchat(); } };
    buttons["decliner"] = { label: "Décliner", callback: it => { } };
    const acheteur = venteData.acheteur?.name ?? 'Un acheteur';
    const vendeur = venteData.vendeur?.name ?? 'Un vendeur';
    let conf = {
      title: `${acheteur} - ${actionAchat} à ${vendeur}`,
      content: html,
      default: actionAchat,
      buttons: buttons
    };

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

  async onAchat() {
    await this.html.find(".nombreLots").change();
    (this.venteData.vendeur ?? this.venteData.acheteur).achatVente({
      userId: game.user.id,
      vendeurId: this.venteData.vendeur?.id,
      acheteurId: this.venteData.acheteur?.id,
      prixTotal: this.venteData.prixTotal,
      chatMessageIdVente: this.venteData.chatMessageIdVente,
      choix: this.venteData.choix,
      vente: this.venteData
    });
  }

  async onAchatConsommer() {
    this.venteData.choix.consommer = true;
    await this.onAchat();
  }

  /* -------------------------------------------- */
  activateListeners(html) {
    super.activateListeners(html);
    this.html = html;
    this.html.find(".nombreLots").change(event => this.setNombreLots(Number(event.currentTarget.value)));
    this.html.find(".se-forcer").change(event => this.setSeForcer(event));
  }

  setSeForcer(event) {
    this.venteData.choix.seForcer = event.currentTarget.checked;
  }

  setNombreLots(nbLots) {

    if (!this.venteData.quantiteIllimite) {
      if (!this.venteData.quantiteIllimite && nbLots > this.venteData.nbLots) {
        ui.notifications.warn(`Seulement ${this.venteData.nbLots} lots disponibles, vous ne pouvez pas en prendre ${nbLots}`)
      }
      nbLots = Math.min(nbLots, this.venteData.nbLots);
    }

    DialogItemAchat.changeNombreLots(this.venteData, nbLots);

    this.html.find(".nombreLots").val(nbLots);
    this.html.find(".prixTotal").text(this.venteData.prixTotal);
    this.html.find("span.total-sust").text(this.venteData.totalSust);
    this.html.find("span.total-desaltere").text(this.venteData.totalDesaltere);
  }


}