var __create = Object.create;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __getProtoOf = Object.getPrototypeOf;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
  for (var name in all)
    __defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
  if (from && typeof from === "object" || typeof from === "function") {
    for (let key of __getOwnPropNames(from))
      if (!__hasOwnProp.call(to, key) && key !== except)
        __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
  }
  return to;
};
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
  // If the importer is in node compatibility mode or this is not an ESM
  // file that has been converted to a CommonJS file using a Babel-
  // compatible transform (i.e. "__esModule" has not been set), then set
  // "default" to the CommonJS "module.exports" for node compatibility.
  isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
  mod
));
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);

// src/modules/Cart/utils/cartProduct.ts
var cartProduct_exports = {};
__export(cartProduct_exports, {
  formatBundle: () => formatBundle,
  formatBundleToOrigin: () => formatBundleToOrigin,
  formatOptions: () => formatOptions,
  formatOptionsToOrigin: () => formatOptionsToOrigin,
  formatProductToCartItem: () => formatProductToCartItem,
  formatProductToCartItemOrigin: () => formatProductToCartItemOrigin,
  getProductDeposit: () => getProductDeposit,
  getProductOriginTotalPrice: () => getProductOriginTotalPrice,
  getProductTotalPrice: () => getProductTotalPrice,
  handleProductDeposit: () => handleProductDeposit,
  handleVariantProduct: () => handleVariantProduct
});
module.exports = __toCommonJS(cartProduct_exports);
var import_decimal = __toESM(require("decimal.js"));
var import_utils = require("../../Product/utils");
var import_utils2 = require("../../../solution/ShopDiscount/utils");
var import_utils3 = require("../../Summary/utils");
var toDiscountPayload = (discountItem) => {
  var _a, _b;
  return {
    amount: discountItem.amount,
    tag: discountItem.type,
    par_value: (_a = discountItem.discount) == null ? void 0 : _a.percent,
    config: discountItem.config,
    metadata: {
      discount_card_type: (_b = discountItem == null ? void 0 : discountItem.discount) == null ? void 0 : _b.discount_card_type
    }
  };
};
var handleVariantProduct = (product) => {
  var _a;
  if (product == null ? void 0 : product.product_variant_id) {
    const targetVariant = (_a = product == null ? void 0 : product.variant) == null ? void 0 : _a.find(
      (n) => n.id === product.product_variant_id
    );
    if (targetVariant) {
      product.price = targetVariant.price;
      if (Number(targetVariant.original_price) > 0) {
        product.original_price = targetVariant.original_price;
      }
      product.is_charge_tax = targetVariant.is_charge_tax;
    }
  }
  return product;
};
var formatProductToCartItem = (params) => {
  var _a, _b, _c;
  console.log("formatProductToCartItem>>>>>>", params);
  const {
    cartItem,
    product,
    bundle,
    options,
    product_variant_id,
    quantity = 1,
    discounts
  } = params;
  const num = quantity;
  if (product) {
    cartItem.id = product == null ? void 0 : product.id;
    cartItem.name = product == null ? void 0 : product.title;
    cartItem.price = product == null ? void 0 : product.price;
    cartItem.num = num;
    cartItem.total = getProductTotalPrice({ product, bundle, options, num, discounts });
    cartItem.totalDifference = getTotalDifference({ product, bundle, discounts });
    cartItem.summaryTotal = cartItem.total * (num || 1);
    cartItem.origin_total = getProductOriginTotalPrice({
      product,
      bundle,
      options,
      num,
      discounts
    });
    const origin_total = getProductTotalPrice({
      product: cartItem._productInit || cartItem._productOrigin,
      bundle,
      options,
      num,
      discounts: []
    });
    cartItem.summaryOriginTotal = (origin_total || 0) * (num || 1);
    cartItem.image = product == null ? void 0 : product.cover;
    cartItem.like_status = "common";
    cartItem.duration = product == null ? void 0 : product.duration;
    cartItem.isNormalProduct = (0, import_utils.isNormalProduct)(product);
    cartItem.is_charge_tax = product == null ? void 0 : product.is_charge_tax;
  }
  if (bundle == null ? void 0 : bundle.length) {
    cartItem.bundle = formatBundle(bundle);
  }
  if (options == null ? void 0 : options.length) {
    cartItem.options = formatOptions(options);
  }
  if (product_variant_id) {
    const sku_key = (_b = (_a = product == null ? void 0 : product.variant) == null ? void 0 : _a.find(
      (n) => n.id === product_variant_id
    )) == null ? void 0 : _b.sku_key;
    if (sku_key) {
      const sku_key_arr = sku_key.split("_");
      const product_option_string = [];
      sku_key_arr.forEach((item) => {
        var _a2, _b2;
        const keyMap = item.split(":");
        const targetVariantGroup = (_a2 = product == null ? void 0 : product.variant_group) == null ? void 0 : _a2.find(
          (n) => String(n.position_id) === keyMap[0]
        );
        const targetVariantItem = (_b2 = targetVariantGroup == null ? void 0 : targetVariantGroup.variant_item) == null ? void 0 : _b2.find(
          (n) => String(n.position_id) === keyMap[1]
        );
        if (targetVariantGroup && targetVariantItem) {
          product_option_string.push(
            `${targetVariantGroup.name}:${targetVariantItem.name}`
          );
        }
      });
      cartItem.product_option_string = product_option_string.join(", ");
    }
  }
  if (((_c = product == null ? void 0 : product.custom_deposit_data) == null ? void 0 : _c.has_deposit) == 1) {
    cartItem.deposit = getProductDeposit({
      cartItem,
      product,
      bundle,
      options,
      num
    });
  }
  const oringin = formatProductToCartItemOrigin(params);
  cartItem._origin = oringin;
  return cartItem;
};
var formatProductToCartItemOrigin = (params) => {
  var _a, _b, _c, _d, _e;
  const {
    cartItem,
    product,
    bundle,
    options,
    product_variant_id,
    quantity = 1
  } = params;
  let origin = cartItem._origin;
  const product_discount_difference = (((_a = origin.product) == null ? void 0 : _a.discount_list) || []).filter((item) => {
    var _a2;
    return !((_a2 = item == null ? void 0 : item.metadata) == null ? void 0 : _a2.custom_product_bundle_map_id);
  }).reduce((pre, cur) => {
    var _a2;
    return pre + (((_a2 = cur == null ? void 0 : cur.metadata) == null ? void 0 : _a2.product_discount_difference) || 0);
  }, 0);
  if (product) {
    origin.product = {
      ...origin.product || {},
      num: quantity,
      product_id: product.id,
      product_variant_id: product_variant_id || 0,
      product_bundle: ((_b = origin.product) == null ? void 0 : _b.product_bundle) || [],
      product_option_item: ((_c = origin.product) == null ? void 0 : _c.product_option_item) || [],
      metadata: {
        product_discount_difference
      }
    };
    origin.sub_type = (_d = product == null ? void 0 : product.duration) == null ? void 0 : _d.type;
    origin.duration = (_e = product == null ? void 0 : product.duration) == null ? void 0 : _e.value;
    if (bundle == null ? void 0 : bundle.length) {
      origin.product.product_bundle = formatBundleToOrigin(bundle);
    }
    if (options == null ? void 0 : options.length) {
      origin.product.product_option_item = formatOptionsToOrigin(options);
    }
  }
  return origin;
};
var getProductTotalPrice = (params) => {
  const { product, bundle, options, discounts } = params;
  let price = Number(product.price);
  const optionRows = (options == null ? void 0 : options.map((currentValue) => ({
    unit: Number(currentValue.price ?? currentValue.add_price ?? 0),
    num: Number(currentValue.num ?? currentValue.quantity ?? 1)
  }))) ?? [];
  if (discounts == null ? void 0 : discounts.length) {
    discounts.forEach((currentValue) => {
      var _a;
      const payload = toDiscountPayload(currentValue);
      price = (0, import_utils2.getDiscountAmount)(payload, price, price);
      if (((_a = currentValue == null ? void 0 : currentValue.config) == null ? void 0 : _a.deductOptionPrice) && optionRows.length) {
        for (let i = 0; i < optionRows.length; i++) {
          const row = optionRows[i];
          optionRows[i] = {
            ...row,
            unit: (0, import_utils2.getDiscountAmount)(payload, row.unit, row.unit)
          };
        }
      }
    });
  }
  if (bundle == null ? void 0 : bundle.length) {
    price = bundle.reduce((accumulator, currentValue) => {
      return accumulator + Number(currentValue.price) * Number(currentValue.num);
    }, price);
  }
  if (optionRows.length) {
    price = optionRows.reduce(
      (accumulator, row) => accumulator + row.unit * row.num,
      price
    );
  }
  return Math.max(0, price);
};
var getTotalDifference = (params) => {
  const { bundle, discounts } = params;
  const bundleDiscountList = [];
  if (bundle == null ? void 0 : bundle.length) {
    bundle.forEach((currentValue) => {
      bundleDiscountList.push(...(currentValue == null ? void 0 : currentValue.discount_list) || []);
    });
  }
  const allDiscounts = [...discounts || [], ...bundleDiscountList];
  const productDiscountProductDiscountDifference = (0, import_utils3.calcDiscountListDifference)(allDiscounts);
  return productDiscountProductDiscountDifference || 0;
};
var getProductOriginTotalPrice = (params) => {
  const { product, bundle, options, discounts } = params;
  const num = (params == null ? void 0 : params.num) || 1;
  let price = Number(product.original_price);
  if ((isNaN(price) || price === 0) && !(discounts == null ? void 0 : discounts.length)) {
    return void 0;
  }
  if (bundle == null ? void 0 : bundle.length) {
    price = bundle.reduce((accumulator, currentValue) => {
      return accumulator + Number(currentValue.price) * Number(currentValue.num);
    }, price);
  }
  if (options == null ? void 0 : options.length) {
    price = options.reduce((accumulator, currentValue) => {
      return accumulator + Number(currentValue.price) * Number(currentValue.num);
    }, price);
  }
  return price;
};
var formatOptions = (options) => {
  if (!(options == null ? void 0 : options.length))
    return [];
  return options.map((item) => {
    return {
      id: item == null ? void 0 : item.id,
      name: item == null ? void 0 : item.name,
      num: item == null ? void 0 : item.num,
      price: item == null ? void 0 : item.price,
      total: item == null ? void 0 : item.price,
      origin_total: item == null ? void 0 : item.original_price
    };
  });
};
var formatOptionsToOrigin = (options) => {
  if (!(options == null ? void 0 : options.length)) {
    return [];
  }
  return options.map((d) => {
    return {
      num: d.num,
      option_group_item_id: d.option_group_item_id,
      option_group_id: d.option_group_id
    };
  });
};
var formatBundle = (bundle) => {
  if (!(bundle == null ? void 0 : bundle.length))
    return [];
  return bundle.map((item) => {
    return {
      id: item == null ? void 0 : item.id,
      title: item == null ? void 0 : item.title,
      num: item == null ? void 0 : item.num,
      price: item == null ? void 0 : item.price,
      total: item == null ? void 0 : item.price,
      price_type: item == null ? void 0 : item.price_type,
      original_price: item == null ? void 0 : item.original_price,
      original_total: item == null ? void 0 : item.original_total,
      price_type_ext: item == null ? void 0 : item.price_type_ext,
      bundle_sum_price: item == null ? void 0 : item.bundle_sum_price,
      bundle_sum_type: item == null ? void 0 : item.bundle_sum_type,
      options: formatOptions(item == null ? void 0 : item.option),
      _bundle_product_id: item._bundle_product_id,
      discount_list: item.discount_list,
      originBundleItem: item.originBundleItem || item,
      is_charge_tax: item == null ? void 0 : item.is_charge_tax
    };
  });
};
var formatBundleToOrigin = (bundle) => {
  if (!(bundle == null ? void 0 : bundle.length))
    return [];
  return bundle.map((d) => {
    const getBundleValueByKey = (key) => {
      var _a;
      return (d == null ? void 0 : d[key]) || ((_a = d == null ? void 0 : d.originBundleItem) == null ? void 0 : _a[key]);
    };
    const product_discount_difference = ((d == null ? void 0 : d.discount_list) || []).reduce((pre, cur) => {
      var _a;
      return pre + (((_a = cur == null ? void 0 : cur.metadata) == null ? void 0 : _a.product_discount_difference) || 0);
    }, 0);
    return {
      bundle_group_id: getBundleValueByKey("group_id"),
      bundle_id: d.id,
      bundle_product_id: getBundleValueByKey("_bundle_product_id") || getBundleValueByKey("product_id"),
      bundle_variant_id: getBundleValueByKey("bundle_variant_id"),
      num: d.num,
      extension_id: getBundleValueByKey("extension_id"),
      extension_type: getBundleValueByKey("extension_type"),
      option: formatOptionsToOrigin(getBundleValueByKey("option")),
      discount_list: d.discount_list,
      "bundle_selling_price": d == null ? void 0 : d.price,
      "custom_price": d == null ? void 0 : d.price,
      metadata: {
        custom_product_bundle_map_id: d._id,
        product_discount_difference
      }
    };
  });
};
var getProductDeposit = (params) => {
  var _a, _b;
  const { cartItem, product, bundle, options } = params;
  const num = (params == null ? void 0 : params.num) || 1;
  if (((_a = product == null ? void 0 : product.custom_deposit_data) == null ? void 0 : _a.has_deposit) == 1) {
    let total = new import_decimal.default(0);
    const {
      deposit_fixed,
      deposit_percentage,
      deposit_policy_data,
      self_deposit_policy_ids
    } = (product == null ? void 0 : product.custom_deposit_data) || {};
    const allProtocols = deposit_policy_data || [];
    let productHasDeposit = false;
    const protocolIds = [];
    if (typeof deposit_fixed === "string" && typeof deposit_percentage === "string") {
      const { depositTotal, result } = handleProductDeposit({
        depositData: product == null ? void 0 : product.custom_deposit_data,
        total: cartItem.total || 0,
        num
      });
      if (result) {
        total = depositTotal;
        protocolIds.push(...self_deposit_policy_ids || []);
        productHasDeposit = true;
      }
    } else {
      if (product == null ? void 0 : product.product_variant_id) {
        const variantProduct = (_b = product == null ? void 0 : product.variant) == null ? void 0 : _b.find(
          (item) => (item == null ? void 0 : item.id) === (product == null ? void 0 : product.product_variant_id)
        );
        if (variantProduct) {
          const depositData = variantProduct == null ? void 0 : variantProduct.custom_deposit_data;
          const { depositTotal, result } = handleProductDeposit({
            depositData,
            total: (cartItem == null ? void 0 : cartItem.total) || 0,
            num
          });
          if (result) {
            total = depositTotal;
            protocolIds.push(...(depositData == null ? void 0 : depositData.self_deposit_policy_ids) || []);
            productHasDeposit = true;
          }
        }
      }
      if (bundle == null ? void 0 : bundle.length) {
        total = bundle.reduce((accumulator, currBundleProduct) => {
          const depositData = currBundleProduct == null ? void 0 : currBundleProduct.custom_deposit_data;
          const { depositTotal, result } = handleProductDeposit({
            depositData,
            total: currBundleProduct == null ? void 0 : currBundleProduct.price,
            num: (currBundleProduct == null ? void 0 : currBundleProduct.num) || 1
          });
          if (result) {
            protocolIds.push(...(depositData == null ? void 0 : depositData.self_deposit_policy_ids) || []);
            productHasDeposit = true;
            return accumulator.plus(depositTotal);
          }
          return accumulator;
        }, new import_decimal.default(0));
      }
    }
    if (productHasDeposit) {
      const ids = new Set(protocolIds);
      const protocols = allProtocols.filter((item) => ids.has(item.id));
      return { total: total.toNumber(), protocols };
    }
    return null;
  }
  return null;
};
var handleProductDeposit = (params) => {
  const { depositData, total, num } = params;
  if (!depositData) {
    return { result: false, depositTotal: new import_decimal.default(0) };
  }
  const { deposit_fixed, deposit_percentage } = depositData || {};
  if (typeof deposit_fixed === "string" && typeof deposit_percentage === "string") {
    const depositFixed = (0, import_decimal.default)(deposit_fixed || 0);
    const depositPercent = (0, import_decimal.default)(deposit_percentage || 0);
    const productTotalPrice = (0, import_decimal.default)(total || 0);
    const deposit = depositFixed.plus(depositPercent.times(productTotalPrice));
    return { depositTotal: deposit.times(num), result: true };
  }
  return { result: false, depositTotal: new import_decimal.default(0) };
};
// Annotate the CommonJS export names for ESM import in node:
0 && (module.exports = {
  formatBundle,
  formatBundleToOrigin,
  formatOptions,
  formatOptionsToOrigin,
  formatProductToCartItem,
  formatProductToCartItemOrigin,
  getProductDeposit,
  getProductOriginTotalPrice,
  getProductTotalPrice,
  handleProductDeposit,
  handleVariantProduct
});
