function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
function _defineProperty(obj, key, value) { key = _toPropertyKey(key); if (key in obj) { Object.defineProperty(obj, key, { value: value, enumerable: true, configurable: true, writable: true }); } else { obj[key] = value; } return obj; }
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : String(i); }
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
import Decimal from 'decimal.js';
import { composeLinePrice, createUuidV4, resolveManualOverrideLineOriginalPrice, sumOptionUnitPrice } from "../../modules/Order/utils";
import { ensureManualProductDiscountList } from "../../modules/Order/utils/manualProductDiscount";

/**
 * 构建金额全为 0 的空 summary。
 * 作为尚未计算金额时的兜底默认值，避免下游因 undefined 报错。
 */
export function createEmptySummary() {
  return {
    product_quantity: 0,
    product_original_amount: '0.00',
    product_amount: '0.00',
    product_expect_amount: '0.00',
    product_tax_fee: '0.00',
    shipping_fee: '0.00',
    shipping_tax_fee: '0.00',
    tax_fee: '0.00',
    surcharge_fee: '0.00',
    discount_amount: '0.00',
    deposit_amount: '0.00',
    expect_amount: '0.00',
    total_amount: '0.00',
    amount_gap: '0.00',
    rounding_amount: '0.00',
    pay_service_charge_amount: '0.00'
  };
}
/**
 * 将选项行 / 套餐行归一成稳定 JSON，用于「同 SKU 是否合并」判断。
 * 数组元素先按主键排序再序列化，避免顺序差异导致误判为不同行。
 */
export function buildProductLineFingerprint(productOptionItem, productBundle) {
  var optArr = Array.isArray(productOptionItem) ? productOptionItem : [];
  var normalizedOpts = optArr.map(function (item) {
    var _item$price;
    return {
      option_group_item_id: Number(item === null || item === void 0 ? void 0 : item.option_group_item_id) || 0,
      option_group_id: Number(item === null || item === void 0 ? void 0 : item.option_group_id) || 0,
      num: typeof (item === null || item === void 0 ? void 0 : item.num) === 'number' && !Number.isNaN(item.num) ? Math.max(1, Math.floor(item.num)) : 1,
      price: String((_item$price = item === null || item === void 0 ? void 0 : item.price) !== null && _item$price !== void 0 ? _item$price : '')
    };
  }).sort(function (p, q) {
    if (p.option_group_item_id !== q.option_group_item_id) {
      return p.option_group_item_id - q.option_group_item_id;
    }
    if (p.option_group_id !== q.option_group_id) return p.option_group_id - q.option_group_id;
    if (p.num !== q.num) return p.num - q.num;
    return p.price.localeCompare(q.price);
  });
  var bundleArr = Array.isArray(productBundle) ? productBundle : [];
  var normalizedBundles = bundleArr.map(function (item) {
    var _ref, _item$bundle_id;
    return {
      bundle_id: Number((_ref = (_item$bundle_id = item === null || item === void 0 ? void 0 : item.bundle_id) !== null && _item$bundle_id !== void 0 ? _item$bundle_id : item === null || item === void 0 ? void 0 : item.id) !== null && _ref !== void 0 ? _ref : 0) || 0,
      product_id: Number(item === null || item === void 0 ? void 0 : item.product_id) || 0,
      num: typeof (item === null || item === void 0 ? void 0 : item.num) === 'number' && !Number.isNaN(item.num) ? Math.max(1, Math.floor(item.num)) : 1
    };
  }).sort(function (p, q) {
    if (p.bundle_id !== q.bundle_id) return p.bundle_id - q.bundle_id;
    if (p.product_id !== q.product_id) return p.product_id - q.product_id;
    return p.num - q.num;
  });
  return JSON.stringify([normalizedOpts, normalizedBundles]);
}
export function getSafeProductNum(num) {
  if (!num || Number.isNaN(num)) return 1;
  if (num < 1) return 1;
  return Math.floor(num);
}

/**
 * removeProductFromOrder 仅传 SKU 时的通配 identity（对象上未声明选项键）。
 * 与显式 `product_option_item: []` 区分：后者只匹配「无选项」行。
 */
export function isSkuOnlyDeleteIdentity(x) {
  if (x.identity_key) return false;
  return !('product_option_item' in x) && !('product_bundle' in x);
}

/**
 * 对外部传入的商品对象做归一化（v2 composite 语义）：
 * - 补全可选字段默认值（未传则使用兜底值，避免后续计算时因 undefined 导致异常）
 * - 对 num 调用 getSafeProductNum 做安全处理
 * - 保留 _origin 供后续业务流程（如促销规则）使用
 *
 * 价格字段语义（metadata 权威源 + composite 派生）：
 * - `metadata.source_product_price`：主商品/variant 基础价（已应用报价单），**不含 option**、
 *   **不含折扣**。是推导 main_product_* 的起点。variant 分支优先读 `metadata.origin.variant[vid].price`。
 * - `metadata.main_product_original_price`：`source + Σ(option.price × option.num)`，**含 option**、
 *   **不含折扣**。
 * - `metadata.main_product_selling_price`：`main_product_original_price - 主商品券 per-unit amount`，
 *   **含 option**、**含折扣**。
 * - 行级 `selling_price` = `main_product_selling_price + Σ(bundle_selling_price × num)`。
 * - 行级 `original_price` = `main_product_original_price + Σ(bundle 原价 × num)`。
 *
 * 迁移与幂等：
 * - `metadata.price_schema_version === 2` → 已新语义归一化，保留 main_product_* 原值（保留折扣）。
 * - 其它情况（v1 / 缺字段 / 无 metadata）→ 按"main_product_selling_price 曾是 main-only"的旧约定
 *   反推 legacyDiscount，再以新 source + options 基准重算。最终统一打上 `price_schema_version: 2`。
 * - 因此多次 normalize 不会重复叠加 option/bundle。
 */
export function normalizeOrderProduct(product) {
  var _product$metadata, _metadata$origin, _metadata$origin2, _variantList$find, _product$is_charge_ta;
  var metadata = _objectSpread({}, product.metadata || {});
  // 不透明 identity 契约：每条订单行必须带 identity_key。
  // 调用方未传时由 SDK 自动生成 UUID，后续 update/remove 只做严格比对，避免猜测合成 key。
  var resolvedIdentityKey = (_product$metadata = product.metadata) !== null && _product$metadata !== void 0 && _product$metadata.unique_identification_number ? String(product.metadata.unique_identification_number) : product.unique_identification_number && String(product.unique_identification_number).length > 0 ? String(product.unique_identification_number) : product.identity_key && String(product.identity_key).length > 0 ? String(product.identity_key) : createUuidV4();
  metadata.unique_identification_number = resolvedIdentityKey;
  var priceOverride = metadata.price_override;
  var originOtherBundle = (_metadata$origin = metadata.origin) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin._extend) === null || _metadata$origin === void 0 || (_metadata$origin = _metadata$origin.other) === null || _metadata$origin === void 0 ? void 0 : _metadata$origin.bundle;
  var bundleInput = product.product_bundle || [];
  if (priceOverride !== undefined && priceOverride !== null && priceOverride !== '' && Array.isArray(originOtherBundle) && originOtherBundle.length > 0) {
    var priceById = new Map();
    originOtherBundle.forEach(function (item) {
      var _item$price2;
      if ((item === null || item === void 0 ? void 0 : item.id) == null) return;
      var unit = (_item$price2 = item.price) !== null && _item$price2 !== void 0 ? _item$price2 : item.bundle_selling_price;
      if (unit === undefined || unit === null) return;
      priceById.set(String(item.id), String(unit));
    });
    var base = Array.isArray(bundleInput) && bundleInput.length > 0 ? bundleInput : originOtherBundle;
    bundleInput = base.map(function (item) {
      var unit = priceById.get(String(item === null || item === void 0 ? void 0 : item.id));
      if (unit === undefined) return item;
      return _objectSpread(_objectSpread({}, item), {}, {
        price: unit,
        bundle_selling_price: unit
      });
    });
  }
  var normalizedBundle = bundleInput.map(function (item) {
    var _item$bundle_id2, _item$bundle_product_, _item$bundle_group_id, _ref2, _item$bundle_selling_, _ref3, _ref4, _item$price3, _ref5, _item$price_type, _ref6, _item$price_type_ext;
    return _objectSpread(_objectSpread({}, item), {}, {
      bundle_id: (_item$bundle_id2 = item.bundle_id) !== null && _item$bundle_id2 !== void 0 ? _item$bundle_id2 : item.id,
      bundle_product_id: (_item$bundle_product_ = item.bundle_product_id) !== null && _item$bundle_product_ !== void 0 ? _item$bundle_product_ : item._bundle_product_id,
      bundle_group_id: (_item$bundle_group_id = item.bundle_group_id) !== null && _item$bundle_group_id !== void 0 ? _item$bundle_group_id : item.group_id,
      bundle_selling_price: (_ref2 = (_item$bundle_selling_ = item.bundle_selling_price) !== null && _item$bundle_selling_ !== void 0 ? _item$bundle_selling_ : item.price) !== null && _ref2 !== void 0 ? _ref2 : '0.00',
      price: (_ref3 = (_ref4 = (_item$price3 = item.price) !== null && _item$price3 !== void 0 ? _item$price3 : item.custom_price) !== null && _ref4 !== void 0 ? _ref4 : item.bundle_selling_price) !== null && _ref3 !== void 0 ? _ref3 : '0.00',
      price_type: (_ref5 = (_item$price_type = item.price_type) !== null && _item$price_type !== void 0 ? _item$price_type : item.custom_price_type) !== null && _ref5 !== void 0 ? _ref5 : '',
      price_type_ext: (_ref6 = (_item$price_type_ext = item.price_type_ext) !== null && _item$price_type_ext !== void 0 ? _item$price_type_ext : item.custom_price_type_ext) !== null && _ref6 !== void 0 ? _ref6 : ''
    });
  });
  var normalizedOptions = product.product_option_item || [];
  var optionSum = sumOptionUnitPrice(normalizedOptions);

  // 1) 解析 source_product_price。
  // 优先级：
  //   1) metadata.source_product_price（v2 权威）
  //   2) variantPrice（命中 variant_id，从 metadata.origin.variant[vid].price 读）
  //   3) _origin.price / _origin.base_price（后端语义的基础价）
  //   4) v1 兼容：无 v2 标记但存在 metadata.main_product_original_price（v1 main-only，即旧 source）
  //   5) 入参 original_price（v1 addProduct 约定：original_price 为 pre-discount 基础价）
  //   6) 入参 selling_price（最末兜底，新添加路径 caller 只给 selling_price）
  var isV2 = metadata.price_schema_version === 2 || metadata.price_schema_version === '2';
  var variantId = Number(product.product_variant_id || 0);
  var variantList = variantId ? metadata === null || metadata === void 0 || (_metadata$origin2 = metadata.origin) === null || _metadata$origin2 === void 0 ? void 0 : _metadata$origin2.variant : null;
  var variantPrice = Array.isArray(variantList) ? (_variantList$find = variantList.find(function (v) {
    return Number(v === null || v === void 0 ? void 0 : v.id) === variantId;
  })) === null || _variantList$find === void 0 ? void 0 : _variantList$find.price : undefined;
  var resolvedSource = function (_product$_origin, _product$_origin2, _ref7, _product$original_pri) {
    if (metadata.source_product_price !== undefined) {
      return String(metadata.source_product_price);
    }
    if (variantPrice !== undefined && variantPrice !== null) {
      return String(variantPrice);
    }
    var originPrice = (_product$_origin = product._origin) === null || _product$_origin === void 0 ? void 0 : _product$_origin.price;
    if (originPrice !== undefined && originPrice !== null) {
      return String(originPrice);
    }
    var originBasePrice = (_product$_origin2 = product._origin) === null || _product$_origin2 === void 0 ? void 0 : _product$_origin2.base_price;
    if (originBasePrice !== undefined && originBasePrice !== null) {
      return String(originBasePrice);
    }
    if (!isV2 && metadata.main_product_original_price !== undefined) {
      return String(metadata.main_product_original_price);
    }
    return (_ref7 = (_product$original_pri = product.original_price) !== null && _product$original_pri !== void 0 ? _product$original_pri : product.selling_price) !== null && _ref7 !== void 0 ? _ref7 : '0.00';
  }();

  // 2) 派生 main_product_original_price（含 option、不含折扣）
  var mainOriginalDec = new Decimal(Number(resolvedSource) || 0).plus(optionSum);
  var mainOriginalStr = mainOriginalDec.toDecimalPlaces(2).toFixed(2);

  // 3) 派生 main_product_selling_price（含 option、含主商品折扣）
  //    - v2 数据：直接沿用 metadata.main_product_selling_price（保留折扣）
  //    - v1 metadata：main_product_selling_price 旧语义是 main-only（≈ source-level 折后价），
  //      反推 legacyDiscount = main_original(旧) - main_selling(旧)，再用新 main_original - legacyDiscount
  //    - v1 addProduct 入参：top-level selling_price < original_price 表示主商品折扣；
  //      用差额作为 legacyDiscount 映射到新 main_selling
  //    - 其它：视为无折扣，main_selling = main_original
  var mainSellingDec;
  if (isV2 && metadata.main_product_selling_price != null) {
    mainSellingDec = new Decimal(Number(metadata.main_product_selling_price) || 0);
  } else if (metadata.main_product_selling_price != null && metadata.main_product_original_price != null) {
    var legacyOriginal = new Decimal(Number(metadata.main_product_original_price) || 0);
    var legacySelling = new Decimal(Number(metadata.main_product_selling_price) || 0);
    var legacyDiscount = legacyOriginal.minus(legacySelling);
    mainSellingDec = mainOriginalDec.minus(legacyDiscount);
  } else if (product.original_price != null && product.selling_price != null && new Decimal(Number(product.original_price) || 0).greaterThan(new Decimal(Number(product.selling_price) || 0))) {
    var topOriginal = new Decimal(Number(product.original_price) || 0);
    var topSelling = new Decimal(Number(product.selling_price) || 0);
    var _legacyDiscount = topOriginal.minus(topSelling);
    mainSellingDec = mainOriginalDec.minus(_legacyDiscount);
  } else {
    mainSellingDec = mainOriginalDec;
  }
  var mainSellingStr = mainSellingDec.toDecimalPlaces(2).toFixed(2);

  // 4) 落盘 metadata：三字段 + schema 版本 sentinel
  metadata.source_product_price = resolvedSource;
  metadata.main_product_original_price = mainOriginalStr;
  metadata.main_product_selling_price = mainSellingStr;
  metadata.price_schema_version = 2;

  // 5) 合成行级 composite（main 已含 option，本步只叠 bundle）
  var composedSellingPrice = composeLinePrice({
    mainPrice: mainSellingStr,
    bundle: normalizedBundle
  });
  var composedOriginalPrice = composeLinePrice({
    mainPrice: mainOriginalStr,
    bundle: normalizedBundle,
    useOriginalBundle: true
  });
  var finalOriginalPrice = resolveManualOverrideLineOriginalPrice({
    num: product.num,
    metadata: metadata,
    lineOriginalPrice: product.original_price
  }, composedOriginalPrice);
  var discountList = ensureManualProductDiscountList({
    discountList: product.discount_list,
    metadata: metadata,
    originalPrice: finalOriginalPrice,
    sellingPrice: composedSellingPrice,
    quantity: getSafeProductNum(product.num)
  });
  return {
    order_detail_id: product.order_detail_id || null,
    product_id: product.product_id,
    num: getSafeProductNum(product.num),
    product_variant_id: product.product_variant_id,
    product_option_item: normalizedOptions,
    selling_price: composedSellingPrice,
    original_price: finalOriginalPrice,
    tax_fee: product.tax_fee || '0.00',
    is_charge_tax: (_product$is_charge_ta = product.is_charge_tax) !== null && _product$is_charge_ta !== void 0 ? _product$is_charge_ta : 0,
    discount_list: discountList,
    product_bundle: normalizedBundle,
    metadata: metadata,
    note: product.note != null ? String(product.note) : ''
  };
}