const shared_consts = require('../tools/shared_nodejs');
const cartModel = require('../models/cart');

const { ObjectId } = require('mongodb');

const Gasordine = require('../models/gasordine');

const Order = require('../models/order');

const Scontistica = require('../models/scontistica');

class OrderClass {
  constructor() {}

  static initOrderTotals(order) {
    order.TotalPriceProduct = 0;
    order.TotalPriceProductCalc = 0;
    order.modify_at = new Date();
  }

  static getNonCumulativeDiscounts(discounts) {
    return discounts.filter((rec) => !rec.cumulativo);
  }

  static applyNonCumulativeDiscounts(order, discounts) {
    let qtadascontare = order.quantity + order.quantitypreordered;
    let qtanonscontata = 0;
    let sconti_da_applicare = [];

    while (qtadascontare > 0) {
      let scontoapplicato = null;

      // Filtriamo gli sconti non cumulativi
      for (const sconto of OrderClass.getNonCumulativeDiscounts(discounts)) {
        if (qtadascontare >= sconto.qta && sconto.qta > 0) {
          // Se la quantità da scontare è maggiore o uguale alla quantità dello sconto, applica lo sconto completo
          scontoapplicato = { ...sconto, qtadascontare: sconto.qta };
          break; // Esci dal ciclo, abbiamo trovato lo sconto applicabile
        } else if (qtadascontare > 0) {
          // Se la quantità da scontare è inferiore allo sconto, applica solo la quantità disponibile
          scontoapplicato = { ...sconto, qtadascontare: qtadascontare };
          qtadascontare = 0; // Abbiamo finito le quantità da scontare
          break;
        }
      }

      // Se c'è uno sconto applicato, aggiungilo alla lista e riduci la quantità
      if (scontoapplicato && scontoapplicato.qtadascontare > 0) {
        sconti_da_applicare.push(scontoapplicato);
        qtadascontare -= scontoapplicato.qtadascontare;
      } else {
        // Se non ci sono più sconti da applicare, la quantità rimasta è non scontata
        qtanonscontata = qtadascontare;
        qtadascontare = 0;
      }
    }

    return { sconti_da_applicare, qtanonscontata };
  }

  static calculateDiscountedPrice(order, sconti_da_applicare, qtanonscontata) {
    let total = 0;

    for (const sconto of sconti_da_applicare) {
      if (sconto.perc_sconto > 0) {
        total += sconto.qtadascontare * order.price * (1 - sconto.perc_sconto / 100);
      } else {
        total += sconto.price;
      }
    }

    if (qtanonscontata > 0) {
      total += order.price * qtanonscontata;
    }

    return total;
  }

  static calculateFullPrice(order) {
    return order.price * order.quantity + order.price * order.quantitypreordered;
  }
}

module.exports = OrderClass;
