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 dayjs from 'dayjs';
import { cacheItemToBookingInput, derivePresetStartTimeFromDate, getProductExtend, getIsAutoClose, isSessionProduct, isBookingProduct, applySessionTimesToExtend, hasActualResourceSelection, productNeedsResourceExtend } from "../../../modules/BookingContext";
import { transformBaseProductToOrderProduct } from "../../BaseSales/utils/transformBaseProductToOrderProduct";

/**
 * cart.addProduct 两阶段决策（与 ticketBooking `handleSelectProduct` 对齐）：
 *
 * 1. `requiresDetail`：规格 / SKU / 套餐 / Session / 称重弹窗（门禁：`isOpenDetailModal` / `cartDetailValue` / `open_sold_weight`）
 * 2. `requiresBookingEdit`：资源 / 时间编辑抽屉（门禁：`getIsAutoClose` on prepared cacheItem）
 * 3. `add`：两关均通过，直接 transform + 加车
 */

/** 资源 / 时间编辑抽屉所需的最小 payload。 */

/**
 * 第一段：是否需要打开规格 / SKU 详情弹窗（与 addService `handleSelectProduct` 一致，不用 `getIsEject` 做门禁）。
 */
function needsSpecDetailModal(item) {
  if (item !== null && item !== void 0 && item.open_sold_weight) return true;
  if (item !== null && item !== void 0 && item.isOpenDetailModal) return true;
  if (!(item !== null && item !== void 0 && item.cartDetailValue)) return true;
  return false;
}

/**
 * 第二段：预约商品是否仍需打开资源 / 时间编辑（与 info2 `cacheItem.autoClose` 等价）。
 */
function needsBookingEdit(cacheItem, ctx) {
  if (isNormalBookingProduct(cacheItem)) return false;
  var isAutoAllocationOn = (ctx === null || ctx === void 0 ? void 0 : ctx.isAutoAllocationOn) || function () {
    return true;
  };
  return !getIsAutoClose(cacheItem, isAutoAllocationOn);
}
function buildRequiresBookingEditPayload(cacheItem, ctx) {
  return {
    cacheItem: cacheItem,
    customerId: ctx === null || ctx === void 0 ? void 0 : ctx.customerId,
    date: typeof (ctx === null || ctx === void 0 ? void 0 : ctx.date) === 'string' ? ctx.date : null
  };
}

/**
 * 加车主决策：对齐 `handleSelectProduct` 两段分支。
 */
export function decideAddProduct(item, ctx) {
  var derivedCtx = withDerivedBookingCtx(ctx);
  if (needsSpecDetailModal(item)) {
    return {
      action: 'requiresDetail',
      payload: buildRequiresDetailPayload(item, derivedCtx)
    };
  }
  var cacheItem = prepareBookingCacheItem(buildCacheItemFromCartDetail(item, derivedCtx), derivedCtx);
  if (needsBookingEdit(cacheItem, derivedCtx)) {
    return {
      action: 'requiresBookingEdit',
      cacheItem: cacheItem,
      payload: buildRequiresBookingEditPayload(cacheItem, derivedCtx)
    };
  }
  return {
    action: 'add',
    cacheItem: cacheItem
  };
}

/**
 * 规格弹窗 callback 后的第二段决策（对齐 `handleBooking4Service` 内 `cacheItem.autoClose` 分支）。
 */
export function decideAfterDetail(cacheItem, ctx) {
  var derivedCtx = withDerivedBookingCtx(ctx);
  var extended = prepareBookingCacheItem(cacheItem, derivedCtx);
  if (needsBookingEdit(extended, derivedCtx)) {
    return {
      action: 'requiresBookingEdit',
      cacheItem: extended,
      payload: buildRequiresBookingEditPayload(extended, derivedCtx)
    };
  }
  return {
    action: 'add',
    cacheItem: extended
  };
}

/**
 * @deprecated 请用 `decideAddProduct`；保留兼容：autoClose=true 仅表示可直接加车（action=add）。
 */

function isNormalBookingProduct(item) {
  return !isBookingProduct(item);
}
function hasPreparedBookingExtend(cacheItem) {
  var _ext$other;
  // 场次/时间已写入但资源仍未选中时，须继续走 getProductExtend（对齐 info2 必定调用 getProductExtend）。
  if (productNeedsResourceExtend(cacheItem) && !hasActualResourceSelection(cacheItem)) {
    return false;
  }
  var ext = (cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem._extend) || {};
  var hasResourceState = Boolean(hasActualResourceSelection(cacheItem) && ext.capacity && (ext.endDate || ext.end_date));
  var hasSessionState = Boolean(isSessionProduct(cacheItem) && ((_ext$other = ext.other) === null || _ext$other === void 0 ? void 0 : _ext$other.session) && ext.start_time && (ext.end_time || ext.endDate));
  var hasMultiDayState = Boolean(isNormalBookingProduct(cacheItem) === false && isMultiDayLike(cacheItem));
  var hasExplicitTimeState = Boolean(ext.duration && (ext.start_date || ext.startDate) && ext.start_time && (ext.end_date && ext.end_time || ext.endDate));
  return hasResourceState || hasSessionState || hasMultiDayState || hasExplicitTimeState;
}

/** 弹窗 / Host 使用的日历日，与 ticketBooking `state.date.format('YYYY-MM-DD')` 对齐。 */
function formatBookingDateForUI(date) {
  if (date == null || date === '') return null;
  var parsed = dayjs(date);
  return parsed.isValid() ? parsed.format('YYYY-MM-DD') : null;
}

/** 补齐 presetStartTime（decideAutoClose / transform 与 BookingTicket.buildAddProductCtx 共用）。 */
function withDerivedBookingCtx(ctx) {
  var _ctx$presetStartTime;
  if (!ctx) return {};
  return _objectSpread(_objectSpread({}, ctx), {}, {
    presetStartTime: (_ctx$presetStartTime = ctx.presetStartTime) !== null && _ctx$presetStartTime !== void 0 ? _ctx$presetStartTime : derivePresetStartTimeFromDate(ctx.date)
  });
}
function isMultiDayLike(cacheItem) {
  var _cacheItem$duration;
  var ext = (cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem._extend) || {};
  return Boolean((cacheItem === null || cacheItem === void 0 || (_cacheItem$duration = cacheItem.duration) === null || _cacheItem$duration === void 0 ? void 0 : _cacheItem$duration.type) === 'days' && ext.duration && ext.start_date && ext.end_date);
}

/**
 * 统一补齐预约商品的运行态字段。
 *
 * 新链路不再让决策和提交各自重建 cacheItem；这里作为唯一入口补齐
 * `_extend.resource / capacity / startDate / endDate` 等后续 booking mapper 需要的字段。
 */
export function prepareBookingCacheItem(cacheItem, ctx) {
  if (isNormalBookingProduct(cacheItem) || hasPreparedBookingExtend(cacheItem)) {
    return cacheItem;
  }
  return getProductExtend({
    cacheItem: cacheItem,
    ctx: withDerivedBookingCtx(ctx),
    isDisabledTime: true
  });
}
export function decideAutoClose(item, ctx) {
  var decision = decideAddProduct(item, ctx);
  if (decision.action === 'add') {
    return {
      autoClose: true,
      cacheItem: decision.cacheItem
    };
  }
  if (decision.action === 'requiresBookingEdit') {
    return {
      autoClose: false,
      cacheItem: decision.cacheItem
    };
  }
  return {
    autoClose: false
  };
}

/**
 * 替代 info2 `getIsEject`：商品是否需要弹窗（含 type='detail' / option_group / bundle_group / variant / session / sold_by_weight）。
 */
export function getIsEject(item) {
  var type = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 'select';
  var isSession = isSessionProduct(item);
  var isSoldByWeight = Boolean(item === null || item === void 0 ? void 0 : item.open_sold_weight);
  var need = type === 'detail' || ((item === null || item === void 0 ? void 0 : item.bundle_group_count) || 0) > 0 || ((item === null || item === void 0 ? void 0 : item.option_group_count) || 0) > 0 || ((item === null || item === void 0 ? void 0 : item.is_variant) || 0) > 0 || isSession || isSoldByWeight;
  return need ? 1 : 0;
}

/** 仅 session 商品（且没有 variant/option/package）。 */
export function getIsOnlySession(item) {
  var isSession = isSessionProduct(item);
  return !(((item === null || item === void 0 ? void 0 : item.bundle_group_count) || 0) > 0 || ((item === null || item === void 0 ? void 0 : item.option_group_count) || 0) > 0 || ((item === null || item === void 0 ? void 0 : item.is_variant) || 0) > 0) && isSession;
}

/**
 * 拼装 requiresDetail payload；showConfig 与 info2 弹窗内部判断一致。
 */
export function buildRequiresDetailPayload(item, ctx) {
  var isOnlySession = getIsOnlySession(item);
  var isEject = getIsEject(item, (ctx === null || ctx === void 0 ? void 0 : ctx.type) || 'select');
  return {
    item: item,
    showConfig: {
      option: ((item === null || item === void 0 ? void 0 : item.option_group_count) || 0) > 0,
      session: isSessionProduct(item),
      variant: ((item === null || item === void 0 ? void 0 : item.is_variant) || 0) > 0,
      package: ((item === null || item === void 0 ? void 0 : item.bundle_group_count) || 0) > 0,
      number: Boolean(item === null || item === void 0 ? void 0 : item.open_sold_weight)
    },
    isOnlySession: isOnlySession,
    isEject: isEject ? 1 : 0,
    customerId: ctx === null || ctx === void 0 ? void 0 : ctx.customerId,
    date: formatBookingDateForUI(ctx === null || ctx === void 0 ? void 0 : ctx.date),
    productData: item
  };
}

/**
 * 用 item.cartDetailValue 拼装一个 cacheItem 雏形（与 info2 `handleDirectAddService` 等价路径）。
 * 这里只补 `_extend.start_date / quantity / other` 等运行态字段；后续走 getProductExtend 才会补齐资源 / 时间。
 */
export function buildCacheItemFromCartDetail(item, ctx) {
  var _item$id, _ref, _ctx$quantity, _item$_extend$price, _item$_extend;
  var cartDetailValue = item.cartDetailValue || {};
  var other = JSON.parse(JSON.stringify(cartDetailValue || {}));
  other.session = cartDetailValue.session;
  /** 列表/接口可能只带 product_id 不带 id，勿用 item.id 覆盖掉已有 product_id */
  var resolvedId = (_item$id = item.id) !== null && _item$id !== void 0 ? _item$id : item.product_id;
  var extend = applySessionTimesToExtend(item, {
    start_date: (ctx === null || ctx === void 0 ? void 0 : ctx.date) || undefined,
    /** 列表连点 / 防抖合并时以 ctx.quantity 为准，避免 cartDetailValue 默认 1 盖掉合并数量 */
    quantity: (_ref = (_ctx$quantity = ctx === null || ctx === void 0 ? void 0 : ctx.quantity) !== null && _ctx$quantity !== void 0 ? _ctx$quantity : cartDetailValue === null || cartDetailValue === void 0 ? void 0 : cartDetailValue.quantity) !== null && _ref !== void 0 ? _ref : 1,
    product_name: item.title,
    other: other,
    isNormalProduct: !isBookingProduct(item),
    price: (_item$_extend$price = item === null || item === void 0 || (_item$_extend = item._extend) === null || _item$_extend === void 0 ? void 0 : _item$_extend.price) !== null && _item$_extend$price !== void 0 ? _item$_extend$price : item === null || item === void 0 ? void 0 : item.price
  }, {
    date: ctx === null || ctx === void 0 ? void 0 : ctx.date
  });
  return _objectSpread(_objectSpread({}, item), {}, {
    id: resolvedId,
    product_id: resolvedId,
    _key: cartDetailValue.key,
    _extend: extend,
    new: 1
  });
}

/**
 * 用 Info2 callback 的 (e, extension_type, detail) 拼装 cacheItem。
 *
 * 保留 detail._extend 中的 pricing / note（规格弹窗改价、备注等），
 * 再叠加 session 时间、ctx.quantity 等运行态字段；other 以 callback `e` 为准。
 */
export function buildCacheItemFromDetail(item, detailResult, ctx) {
  var _detailResult$e, _currentItem$id, _detail$extension_typ, _ref2, _ref3, _ctx$quantity2, _detailResult$e2, _ref4, _detailExtend$price, _currentItem$title, _detailExtend$note, _detailResult$e3;
  var _currentItem = detailResult.detail || item;
  var _detail = _currentItem;
  var detailExtend = (_detail === null || _detail === void 0 ? void 0 : _detail._extend) || {};
  var other = JSON.parse(JSON.stringify(detailResult.e || {}));
  other.session = (_detailResult$e = detailResult.e) === null || _detailResult$e === void 0 ? void 0 : _detailResult$e.session;
  var resolvedId = (_currentItem$id = _currentItem.id) !== null && _currentItem$id !== void 0 ? _currentItem$id : _currentItem.product_id;
  var mergedItem = _objectSpread(_objectSpread(_objectSpread({}, item), _detail), {}, {
    extension_type: (_detail$extension_typ = _detail.extension_type) !== null && _detail$extension_typ !== void 0 ? _detail$extension_typ : item.extension_type
  });
  var runtimeExtend = applySessionTimesToExtend(mergedItem, {
    start_date: (ctx === null || ctx === void 0 ? void 0 : ctx.date) || detailExtend.start_date || undefined,
    quantity: (_ref2 = (_ref3 = (_ctx$quantity2 = ctx === null || ctx === void 0 ? void 0 : ctx.quantity) !== null && _ctx$quantity2 !== void 0 ? _ctx$quantity2 : (_detailResult$e2 = detailResult.e) === null || _detailResult$e2 === void 0 ? void 0 : _detailResult$e2.quantity) !== null && _ref3 !== void 0 ? _ref3 : detailExtend.quantity) !== null && _ref2 !== void 0 ? _ref2 : 1,
    price: (_ref4 = (_detailExtend$price = detailExtend.price) !== null && _detailExtend$price !== void 0 ? _detailExtend$price : _detail === null || _detail === void 0 ? void 0 : _detail.price) !== null && _ref4 !== void 0 ? _ref4 : item === null || item === void 0 ? void 0 : item.price,
    product_name: (_currentItem$title = _currentItem.title) !== null && _currentItem$title !== void 0 ? _currentItem$title : detailExtend.product_name,
    other: other,
    isNormalProduct: !isBookingProduct(mergedItem)
  }, {
    date: ctx === null || ctx === void 0 ? void 0 : ctx.date
  });
  var extend = _objectSpread(_objectSpread(_objectSpread({}, detailExtend), runtimeExtend), {}, {
    other: other
  });
  var note = (_detailExtend$note = detailExtend.note) !== null && _detailExtend$note !== void 0 ? _detailExtend$note : _detail === null || _detail === void 0 ? void 0 : _detail.note;
  return _objectSpread(_objectSpread(_objectSpread({}, _detail), {}, {
    id: resolvedId,
    product_id: resolvedId,
    extension_type: mergedItem.extension_type,
    _key: (_detailResult$e3 = detailResult.e) === null || _detailResult$e3 === void 0 ? void 0 : _detailResult$e3.key
  }, note != null && note !== '' ? {
    note: String(note)
  } : {}), {}, {
    _extend: extend,
    new: 1
  });
}

/**
 * `transformDetailToProductAndBooking`：把 cacheItem 拆成 OS `addProductToOrder` 所需的 `(product, booking)`。
 *
 * - `product` 走 `transformBaseProductToOrderProduct`（沿用 BaseSales 现有 mapper）。
 * - `booking` 走 `cacheItemToBookingInput`（严格按 TEMP_ORDER_FIELDS_SUMMARY.md 协议）。
 * - 普通商品（无 duration / 无 schedules）不产 booking，与 info2 一致。
 */
export function transformDetailToProductAndBooking(cacheItem, ctx) {
  var preparedCacheItem = prepareBookingCacheItem(cacheItem, withDerivedBookingCtx(ctx));
  var payload = buildBasePayloadFromCacheItem(preparedCacheItem, ctx);
  var productInput = transformBaseProductToOrderProduct({
    payload: payload,
    sourceProduct: preparedCacheItem
  });
  if (!productInput) {
    throw new Error('[BookingTicket] transformDetailToProductAndBooking: product transform failed (missing numeric item.id / item.product_id)');
  }
  var isNormalProduct = isNormalBookingProduct(preparedCacheItem);
  var booking;
  if (!isNormalProduct) {
    booking = cacheItemToBookingInput(preparedCacheItem, {
      bookingConfig: ctx === null || ctx === void 0 ? void 0 : ctx.bookingConfig
    });
  }
  return {
    product: productInput,
    booking: booking,
    cacheItem: preparedCacheItem
  };
}

/**
 * 把 cacheItem._extend.other 中的字段 + 顶层运行态拼成 `BaseProductDetailPayload`。
 */
function buildBasePayloadFromCacheItem(cacheItem, ctx) {
  var _cacheItem$_extend, _cacheItem$_extend$qu, _cacheItem$_extend2, _cacheItem$product_id, _cacheItem$id, _ref5, _other$product_varian, _extend$skuValue, _extend$_skuValue, _extend$price, _extend$price2;
  var other = (cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend = cacheItem._extend) === null || _cacheItem$_extend === void 0 ? void 0 : _cacheItem$_extend.other) || {};
  var quantity = (ctx === null || ctx === void 0 ? void 0 : ctx.quantity) != null && ctx.quantity > 0 ? ctx.quantity : (_cacheItem$_extend$qu = cacheItem === null || cacheItem === void 0 || (_cacheItem$_extend2 = cacheItem._extend) === null || _cacheItem$_extend2 === void 0 ? void 0 : _cacheItem$_extend2.quantity) !== null && _cacheItem$_extend$qu !== void 0 ? _cacheItem$_extend$qu : 1;
  var resolvedPid = (_cacheItem$product_id = cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.product_id) !== null && _cacheItem$product_id !== void 0 ? _cacheItem$product_id : cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.id;
  var extend = (cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem._extend) || {};
  return {
    id: (_cacheItem$id = cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.id) !== null && _cacheItem$id !== void 0 ? _cacheItem$id : cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.product_id,
    product_id: resolvedPid,
    variant_id: (_ref5 = (_other$product_varian = other === null || other === void 0 ? void 0 : other.product_variant_id) !== null && _other$product_varian !== void 0 ? _other$product_varian : other === null || other === void 0 ? void 0 : other.variant_id) !== null && _ref5 !== void 0 ? _ref5 : 0,
    quantity: quantity,
    option: (other === null || other === void 0 ? void 0 : other.option) || [],
    bundle: (other === null || other === void 0 ? void 0 : other.bundle) || (extend === null || extend === void 0 || (_extend$skuValue = extend.skuValue) === null || _extend$skuValue === void 0 ? void 0 : _extend$skuValue.bundle) || (extend === null || extend === void 0 || (_extend$_skuValue = extend._skuValue) === null || _extend$_skuValue === void 0 ? void 0 : _extend$_skuValue.bundle) || [],
    unique: other === null || other === void 0 ? void 0 : other.unique,
    session: other === null || other === void 0 ? void 0 : other.session,
    note: extend === null || extend === void 0 ? void 0 : extend.note,
    price: (_extend$price = extend === null || extend === void 0 ? void 0 : extend.price) !== null && _extend$price !== void 0 ? _extend$price : cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.price,
    selling_price: (_extend$price2 = extend === null || extend === void 0 ? void 0 : extend.price) !== null && _extend$price2 !== void 0 ? _extend$price2 : cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.price,
    line_total: extend === null || extend === void 0 ? void 0 : extend.total,
    total: extend === null || extend === void 0 ? void 0 : extend.total,
    origin_total: extend === null || extend === void 0 ? void 0 : extend.origin_total,
    price_override: extend === null || extend === void 0 ? void 0 : extend.priceOverride,
    bundle_edit: extend === null || extend === void 0 ? void 0 : extend.bundle_edit,
    discount_reason: extend === null || extend === void 0 ? void 0 : extend.discount_reason,
    discount_list: cacheItem === null || cacheItem === void 0 ? void 0 : cacheItem.discount_list,
    _extend: extend
  };
}