import { BookingCalcContext } from '../../../modules/BookingContext';
import type { ProductData } from '../../../modules/Product/types';
import type { OrderProduct, OrderProductIdentity, AddProductBookingInput } from '../../../modules/Order/types';
/**
 * cart.addProduct 两阶段决策（与 ticketBooking `handleSelectProduct` 对齐）：
 *
 * 1. `requiresDetail`：规格 / SKU / 套餐 / Session / 称重弹窗（门禁：`isOpenDetailModal` / `cartDetailValue` / `open_sold_weight`）
 * 2. `requiresBookingEdit`：资源 / 时间编辑抽屉（门禁：`getIsAutoClose` on prepared cacheItem）
 * 3. `add`：两关均通过，直接 transform + 加车
 */
export type AddProductDecision = {
    action: 'add';
    cacheItem: any;
} | {
    action: 'requiresDetail';
    payload: AddProductRequiresDetailPayload;
} | {
    action: 'requiresBookingEdit';
    cacheItem: any;
    payload: AddProductRequiresBookingEditPayload;
};
/** 资源 / 时间编辑抽屉所需的最小 payload。 */
export interface AddProductRequiresBookingEditPayload {
    cacheItem: any;
    customerId?: number | string;
    date: string | null;
}
/**
 * 加车主决策：对齐 `handleSelectProduct` 两段分支。
 */
export declare function decideAddProduct(item: any, ctx?: AddProductDecideContext): AddProductDecision;
/**
 * 规格弹窗 callback 后的第二段决策（对齐 `handleBooking4Service` 内 `cacheItem.autoClose` 分支）。
 */
export declare function decideAfterDetail(cacheItem: any, ctx?: AddProductDecideContext): AddProductDecision;
/**
 * @deprecated 请用 `decideAddProduct`；保留兼容：autoClose=true 仅表示可直接加车（action=add）。
 */
export interface AddProductRequiresDetailPayload {
    item: ProductData | Record<string, any>;
    /** UI 需展示的子弹窗开关。 */
    showConfig: {
        option: boolean;
        session: boolean;
        variant: boolean;
        package: boolean;
        number: boolean;
    };
    /** 仅 session 商品（且无 variant/option/package）→ true，UI 可只渲染 session 选择。 */
    isOnlySession: boolean;
    /** 0/1，与 info2 `getIsEject` 等价含义。 */
    isEject: 0 | 1;
    /** 当前选中客户 id（透传给 detail 弹窗用）。 */
    customerId?: number | string;
    /** 当前选择的日期。 */
    date: string | null;
    /** 透传完整商品数据，UI 渲染时直接用。 */
    productData: ProductData | Record<string, any>;
}
export interface AddProductDecideContext extends BookingCalcContext {
    type?: 'select' | 'detail';
    quantity?: number;
    customerId?: number | string;
}
/**
 * 统一补齐预约商品的运行态字段。
 *
 * 新链路不再让决策和提交各自重建 cacheItem；这里作为唯一入口补齐
 * `_extend.resource / capacity / startDate / endDate` 等后续 booking mapper 需要的字段。
 */
export declare function prepareBookingCacheItem(cacheItem: any, ctx?: AddProductDecideContext): any;
export declare function decideAutoClose(item: any, ctx?: AddProductDecideContext): {
    autoClose: boolean;
    cacheItem?: any;
};
/**
 * 替代 info2 `getIsEject`：商品是否需要弹窗（含 type='detail' / option_group / bundle_group / variant / session / sold_by_weight）。
 */
export declare function getIsEject(item: any, type?: 'select' | 'detail'): 0 | 1;
/** 仅 session 商品（且没有 variant/option/package）。 */
export declare function getIsOnlySession(item: any): boolean;
/**
 * 拼装 requiresDetail payload；showConfig 与 info2 弹窗内部判断一致。
 */
export declare function buildRequiresDetailPayload(item: any, ctx?: AddProductDecideContext): AddProductRequiresDetailPayload;
/**
 * 用 item.cartDetailValue 拼装一个 cacheItem 雏形（与 info2 `handleDirectAddService` 等价路径）。
 * 这里只补 `_extend.start_date / quantity / other` 等运行态字段；后续走 getProductExtend 才会补齐资源 / 时间。
 */
export declare function buildCacheItemFromCartDetail(item: any, ctx?: AddProductDecideContext): any;
/**
 * 用 Info2 callback 的 (e, extension_type, detail) 拼装 cacheItem。
 *
 * 保留 detail._extend 中的 pricing / note（规格弹窗改价、备注等），
 * 再叠加 session 时间、ctx.quantity 等运行态字段；other 以 callback `e` 为准。
 */
export declare function buildCacheItemFromDetail(item: any, detailResult: {
    e: any;
    extension_type?: any;
    detail?: any;
}, ctx?: AddProductDecideContext): any;
/**
 * `transformDetailToProductAndBooking`：把 cacheItem 拆成 OS `addProductToOrder` 所需的 `(product, booking)`。
 *
 * - `product` 走 `transformBaseProductToOrderProduct`（沿用 BaseSales 现有 mapper）。
 * - `booking` 走 `cacheItemToBookingInput`（严格按 TEMP_ORDER_FIELDS_SUMMARY.md 协议）。
 * - 普通商品（无 duration / 无 schedules）不产 booking，与 info2 一致。
 */
export declare function transformDetailToProductAndBooking(cacheItem: any, ctx?: AddProductDecideContext): {
    product: Partial<OrderProduct> & OrderProductIdentity;
    booking?: AddProductBookingInput;
    cacheItem: any;
};
