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 _toArray(arr) { return _arrayWithHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableRest(); }
function _nonIterableRest() { throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) arr2[i] = arr[i]; return arr2; }
function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }
function _arrayWithHoles(arr) { if (Array.isArray(arr)) return arr; }
import Decimal from 'decimal.js';
export var CUSTOM_TARE_STORAGE_KEY = 'pisell-weighing-custom-tares';
export var DEFAULT_TARE_STORAGE_KEY = 'pisell-weighing-default-tare';

/** 插件返回 3 位小数精度，展示与其保持一致。 */
export var formatWeight = function formatWeight(value) {
  return Number(value || 0).toFixed(3);
};

/** @param symbol 货币符号，默认 '$' */
export var formatMoney = function formatMoney(value) {
  var symbol = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : '$';
  return "".concat(symbol).concat(Number(value || 0).toFixed(2));
};
export var getScaleTag = function getScaleTag(status, error) {
  if (error) return 'Error';
  if (status === 'stable') return 'Stable';
  if (status === 'unstable') return 'Unstable';
  if (status === 'overload') return 'Overload';
  return 'Listening';
};

/** 过滤非数字字符，保证只有一个小数点。 */
export var sanitizeManualWeight = function sanitizeManualWeight(value) {
  var nextValue = value.replace(/[^0-9.]/g, '');
  var _nextValue$split = nextValue.split('.'),
    _nextValue$split2 = _toArray(_nextValue$split),
    integerPart = _nextValue$split2[0],
    decimalParts = _nextValue$split2.slice(1);
  if (!decimalParts.length) {
    return integerPart;
  }
  return "".concat(integerPart, ".").concat(decimalParts.join(''));
};

/**
 * 为 initialValue.tare 还原项生成确定性 ID，保证 customTareOptions 初始化与
 * selectedTare 初始化使用同一个 ID，不需要在两处传递中间状态。
 */
export var getRestoredTareId = function getRestoredTareId(tare) {
  return "restored-".concat(tare.label.replace(/\s+/g, '-'), "-").concat(tare.value);
};
export var readCustomTares = function readCustomTares() {
  if (typeof window === 'undefined') {
    return [];
  }
  try {
    var rawValue = window.localStorage.getItem(CUSTOM_TARE_STORAGE_KEY);
    if (!rawValue) {
      return [];
    }
    var parsedValue = JSON.parse(rawValue);
    if (!Array.isArray(parsedValue)) {
      return [];
    }
    return parsedValue.filter(function (item) {
      var hasBasicShape = item && typeof item.id === 'string' && typeof item.label === 'string' && typeof item.value === 'number';
      var hasValidUnit = typeof (item === null || item === void 0 ? void 0 : item.unit) === 'undefined' || item.unit === 'KILOGRAMS' || item.unit === 'GRAMS' || item.unit === 'POUNDS' || item.unit === 'OUNCES';
      return hasBasicShape && hasValidUnit;
    });
  } catch (_unused) {
    return [];
  }
};
export var readDefaultTareId = function readDefaultTareId() {
  if (typeof window === 'undefined') {
    return undefined;
  }
  try {
    var rawValue = window.localStorage.getItem(DEFAULT_TARE_STORAGE_KEY);
    return rawValue || undefined;
  } catch (_unused2) {
    return undefined;
  }
};
export var PRODUCT_TARE_MAP_KEY = 'pisell-weighing-product-tare-map';

/**
 * 构造商品 + 规格的皮重偏好存储 key。
 * 无 variantId 时 key 形如 `{productId}:`，有 variantId 时形如 `{productId}:{variantId}`。
 */
export var getProductTareKey = function getProductTareKey(productId, variantId) {
  return "".concat(productId, ":").concat(variantId !== null && variantId !== void 0 ? variantId : '');
};

/**
 * 读取商品皮重偏好映射表（productKey → tareId）。
 */
export var readProductTareMap = function readProductTareMap() {
  if (typeof window === 'undefined') {
    return {};
  }
  try {
    var raw = window.localStorage.getItem(PRODUCT_TARE_MAP_KEY);
    if (!raw) return {};
    var parsed = JSON.parse(raw);
    return _typeof(parsed) === 'object' && parsed !== null ? parsed : {};
  } catch (_unused3) {
    return {};
  }
};

/**
 * 保存某个商品 + 规格的皮重偏好。
 */
export var saveProductTarePref = function saveProductTarePref(productKey, tareId) {
  if (typeof window === 'undefined') {
    return;
  }
  try {
    var map = readProductTareMap();
    map[productKey] = tareId;
    window.localStorage.setItem(PRODUCT_TARE_MAP_KEY, JSON.stringify(map));
  } catch (_unused4) {
    // ignore storage errors
  }
};

/** 每种重量单位对应的展示缩写。 */
export var UNIT_LABEL = {
  KILOGRAMS: 'kg',
  GRAMS: 'g',
  POUNDS: 'lb',
  OUNCES: 'oz'
};

/**
 * 判断商品是否为称重商品（按重量计价，依赖秤读数结算）。
 * 对应后台字段 open_sold_weight === 1。
 */
export var isWeighingProduct = function isWeighingProduct(productData) {
  return Number((productData === null || productData === void 0 ? void 0 : productData.open_sold_weight) || 0) === 1;
};

/**
 * 按 variantId 在 productData.variant[] 中定位当前选中的 variant，
 * 若存在则返回 variant 级数据，否则降级到商品根级。
 *
 * 用于称重相关字段（open_sold_weight / unit / unit_value）的数据源解析，
 * 确保多规格商品中每个 variant 可以独立配置称重信息。
 */
export var resolveWeighingSource = function resolveWeighingSource(productData, variantId) {
  var _variants$find;
  var pd = productData;
  var variants = (pd === null || pd === void 0 ? void 0 : pd.variant) || [];
  var activeVariant = variantId ? (_variants$find = variants.find(function (v) {
    return Number(v.id) === Number(variantId);
  })) !== null && _variants$find !== void 0 ? _variants$find : null : null;
  return activeVariant !== null && activeVariant !== void 0 ? activeVariant : pd;
};

// 获取称重后的商品单位价格
// 将称重部分看作整体【虚拟商品】
// 称重后的商品单位价格 = 商品原始单价 * 称重后的商品数量（1）
// 如果还选择了套餐商品项或者单规格商品项，则需要将套餐商品项或者单规格商品项的商品单价也计算进去
export var getWeighedUnitPrice = function getWeighedUnitPrice(params) {
  var weighedTotalAmount = params.weighedTotalAmount,
    productData = params.productData,
    skuValue = params.skuValue;
  if (!productData) {
    return 0;
  }
  var price = new Decimal(weighedTotalAmount !== null && weighedTotalAmount !== void 0 ? weighedTotalAmount : 0);
  if (Array.isArray(skuValue === null || skuValue === void 0 ? void 0 : skuValue.bundle) && skuValue.bundle.length > 0) {
    price = skuValue.bundle.reduce(function (accumulator, currentValue) {
      var _ref, _currentValue$origina;
      var currentPrice = new Decimal((_ref = (_currentValue$origina = currentValue === null || currentValue === void 0 ? void 0 : currentValue.original_price) !== null && _currentValue$origina !== void 0 ? _currentValue$origina : currentValue === null || currentValue === void 0 ? void 0 : currentValue.price) !== null && _ref !== void 0 ? _ref : 0);
      var currentNum = new Decimal((currentValue === null || currentValue === void 0 ? void 0 : currentValue.num) || 0);
      return accumulator.add(currentPrice.mul(currentNum));
    }, price);
  }
  if (Array.isArray(skuValue === null || skuValue === void 0 ? void 0 : skuValue.option) && skuValue.option.length > 0) {
    price = skuValue.option.reduce(function (accumulator, currentValue) {
      var _ref2, _currentValue$origina2;
      var currentPrice = new Decimal((_ref2 = (_currentValue$origina2 = currentValue === null || currentValue === void 0 ? void 0 : currentValue.original_price) !== null && _currentValue$origina2 !== void 0 ? _currentValue$origina2 : currentValue === null || currentValue === void 0 ? void 0 : currentValue.price) !== null && _ref2 !== void 0 ? _ref2 : 0);
      var currentNum = new Decimal((currentValue === null || currentValue === void 0 ? void 0 : currentValue.num) || 0);
      return accumulator.add(currentPrice.mul(currentNum));
    }, price);
  }
  return price.toNumber();
};