import type { BookingTicketHandle, SalesSdkCartBookingView, ScanOrderOrderProduct } from '../types';
/** 未分配预约主体的购物车行（用于提交前弹窗） */
export interface UnassignedHolderLine {
    cacheItem: Record<string, any>;
    booking: Record<string, any>;
    orderLine: ScanOrderOrderProduct;
}
/** 弹窗快照行：打开时冻结，分配后仍展示 */
export interface HolderConfirmSnapshotKey {
    productUid: string;
    groupId?: string;
}
/** 弹窗展示行（快照 + 实时 enriched 视图） */
export interface HolderConfirmDisplayLine extends UnassignedHolderLine {
    displayBooking: SalesSdkCartBookingView;
    /** 当前是否已分配 holder（实时） */
    isAssigned: boolean;
}
/**
 * 按 groupId 去重未分配行，与 booking `confirmHolderModal` 计数规则一致。
 *
 * @example
 * const lines = dedupeUnassignedHolderLines(rawLines);
 * calculateUnassignedHolderCount(lines); // => 未分配主体数量
 */
export declare function dedupeUnassignedHolderLines(lines: UnassignedHolderLine[]): UnassignedHolderLine[];
/**
 * 统计未分配预约主体数量（按 quantity 累加）。
 *
 * @example
 * calculateUnassignedHolderCount(lines); // 1 个商品 quantity=2 => 2
 */
export declare function calculateUnassignedHolderCount(lines: UnassignedHolderLine[]): number;
/**
 * 从 BookingTicket 购物车收集「需分配 holder 且尚未分配」的预约行。
 *
 * @example
 * const lines = collectUnassignedHolderLines(bookingTicket);
 */
export declare function collectUnassignedHolderLines(bookingTicket: BookingTicketHandle | null | undefined): UnassignedHolderLine[];
/**
 * 将未分配行映射为购物车 enriched booking 视图，保证弹窗卡片与 SaleDetail 一致。
 *
 * @example
 * resolveEnrichedBookingForLine(line, cart.bookings);
 */
export declare function resolveEnrichedBookingForLine(line: UnassignedHolderLine, cartBookings: SalesSdkCartBookingView[]): SalesSdkCartBookingView;
/**
 * 从当前未分配行生成弹窗快照 key（与 dedupe 规则一致）。
 *
 * @example
 * buildHolderConfirmSnapshotKeys(collectUnassignedHolderLines(bookingTicket));
 */
export declare function buildHolderConfirmSnapshotKeys(lines: UnassignedHolderLine[]): HolderConfirmSnapshotKey[];
/**
 * 按 product_uid 从 OS 购物车反查一行（含已分配 holder）。
 */
export declare function resolveLineByProductUid(bookingTicket: BookingTicketHandle, productUid: string): UnassignedHolderLine | null;
/**
 * 按打开时的快照渲染弹窗列表：卡片不随分配消失，数据随 cart 刷新。
 *
 * @example
 * buildHolderConfirmDisplayLines({ bookingTicket, snapshotLineKeys, cartBookings });
 */
export declare function buildHolderConfirmDisplayLines(input: {
    bookingTicket: BookingTicketHandle;
    snapshotLineKeys: HolderConfirmSnapshotKey[];
    cartBookings: SalesSdkCartBookingView[];
}): HolderConfirmDisplayLine[];
/**
 * 保存 / 结账前是否应弹出「预约主体未分配」确认弹窗（与 ticketBooking Footer 一致）。
 *
 * @example
 * shouldPromptHolderBeforeSubmit({ customerId: 12, bookingConfig, bookingTicket });
 */
export declare function shouldPromptHolderBeforeSubmit(input: {
    customerId?: number | string | null;
    bookingConfig?: Record<string, any> | null;
    bookingTicket?: BookingTicketHandle | null;
}): boolean;
