import { ScanOrderOrderProduct, ScanOrderOrderProductIdentity, ScanOrderResourceCapacitySlot, ScanOrderResourceSelectType, ScanOrderSummary, ScanOrderTempOrder } from './types';
import type { CartItemSummary, ItemRuleBusinessData, PaxInfo, QuantityLimitResult } from '../../model/strategy/adapter/itemRule';
import type { StrategyConfig } from '../../model/strategy/type';
import type { ProductData } from '../../modules/Product/types';
/**
 * 构建金额全为 0 的空 summary。
 * 作为尚未计算金额时的兜底默认值，避免下游因 undefined 报错。
 */
export declare function createEmptySummary(): ScanOrderSummary;
/**
 * 商品数量安全取值。
 * - NaN / undefined / < 1 均视作 1（最低起订量）
 * - 有值时取整（不支持小数数量）
 */
export declare function getSafeProductNum(num?: number): number;
/**
 * 宽松布尔值转换。
 * 兼容后端/配置中心常见的 boolean / number / string 表达，统一归一成 true/false。
 */
export declare function toBoolean(value: unknown): boolean;
/**
 * 将值归一化为有效的正向字符串。
 * null / undefined / 空串 / '0' / 'null' 统一视为无效值并返回 undefined。
 */
export declare function toPositiveString(value: unknown): string | undefined;
/**
 * 归一化 item rule 策略模型 ID 列表。
 * - 支持 string / number 混合输入
 * - 仅保留 > 0 的合法数字
 * - 自动去重
 */
export declare function normalizeEnabledItemRuleIds(rawIds: unknown): number[];
/**
 * 从 tableConfig 中提取合法策略模型 ID 列表。
 */
export declare function extractStrategyModelIdsFromTableConfig(tableConfig: Record<string, any> | null | undefined): number[];
/**
 * 仅保留 item_rule 类型策略。
 */
export declare function normalizeItemRuleStrategies(configs: unknown): StrategyConfig[];
export declare function toNonNegativeNumber(value: unknown): number;
export declare function toNonNegativeInt(value: unknown): number;
export declare function toPriceString(value: unknown, fallback?: string): string;
export declare function buildProductKey(productId: number, productVariantId: number): string;
export declare function getTopLevelProductId(product: Record<string, any>): number | null;
export declare function getTopLevelVariantId(product: Record<string, any>): number | null;
export declare function buildQuantityLimitIndex(limits: QuantityLimitResult[]): {
    exactLimitMap: Map<string, QuantityLimitResult[]>;
    productLimitMap: Map<number, QuantityLimitResult[]>;
};
export declare function resolveSkuMatchedQuantityLimits(params: {
    productId: number;
    variantId: number | null;
    limitIndex: {
        exactLimitMap: Map<string, QuantityLimitResult[]>;
        productLimitMap: Map<number, QuantityLimitResult[]>;
    };
}): QuantityLimitResult[];
export declare function aggregateItemRuleLimit(matchedLimits: QuantityLimitResult[]): {
    min: number | undefined;
    max: number | undefined;
    remainingMax: number | undefined;
    exact: number | undefined;
    mustInclude: boolean;
    validationMessage: string | undefined;
    rawValidationMessage: string | Record<string, string> | undefined;
    maxValidationMessage: string | undefined;
    rawMaxValidationMessage: string | Record<string, string> | undefined;
    minValidationMessage: string | undefined;
    rawMinValidationMessage: string | Record<string, string> | undefined;
} | null;
export declare function buildItemRuleBusinessData(params: {
    tempOrder: ScanOrderTempOrder;
    runtimeConfig: {
        pax?: Partial<PaxInfo>;
        historicalItems?: CartItemSummary[];
        serviceType?: string;
        submissionIndex?: number;
        custom?: Record<string, any>;
    };
    itemRuleConfigs: StrategyConfig[];
}): ItemRuleBusinessData;
export declare function attachItemRuleLimitsToTopLevelProducts<T>(productList: T, limits: QuantityLimitResult[]): T;
/**
 * 将选项行 / 套餐行归一成稳定 JSON，用于「同 SKU 是否合并」判断。
 * 数组元素先按主键排序再序列化，避免顺序差异导致误判为不同行。
 */
export declare function buildProductLineFingerprint(productOptionItem?: unknown, productBundle?: unknown): string;
/**
 * removeProductFromOrder 仅传 SKU 时的通配 identity（对象上未声明选项键）。
 * 与显式 `product_sku: { option: [] }` 区分：后者只匹配「无选项」行。
 */
export declare function isSkuOnlyDeleteIdentity(x: ScanOrderOrderProductIdentity): boolean;
/**
 * 判断两个商品 identity 是否匹配（不透明 identity 契约）。
 *
 * 调用约定：始终 `isIdentityMatch(line, callerIdentity)`。
 * - 若 SKU（product_id + product_variant_id）不一致 → 不匹配。
 * - **双方都带** `identity_key` → 严格字符串相等比较（不再猜测合成 key / metadata 桥接）。
 *   这是 opaque identity 契约的标准路径：UI 删改时透传 SDK 回灌的 identity_key。
 * - 否则（即至少一侧未声明 identity_key）→ 进入「SKU 通配 / 显式空选项 / 指纹」回退路径，
 *   忽略线侧 identity_key，按内容语义匹配。这给「行已 opaque、调用方却想按 SKU 通配 / 选项指纹删除」留兼容入口。
 */
export declare function isIdentityMatch(a: ScanOrderOrderProductIdentity, b: ScanOrderOrderProductIdentity): boolean;
/**
 * 根据 identity 在商品列表中定位下标。
 * 用于判断商品是否已存在（已存在则累加数量，否则新增）。
 */
export declare function getProductIdentityIndex(products: ScanOrderOrderProduct[], identity: ScanOrderOrderProductIdentity): number;
/**
 * 对外部传入的商品对象做归一化（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 declare function normalizeOrderProduct(product: Partial<ScanOrderOrderProduct> & ScanOrderOrderProductIdentity): ScanOrderOrderProduct;
/**
 * 从 reservation.enabled_reservation_rules 中收集 type=link 的商品 id。
 */
export declare function collectLinkProductIdsFromReservationRules(rules: unknown): number[];
/**
 * 返回列表中第一个带有效 duration.value（分钟）的商品时长。
 */
export declare function pickFirstDurationMinutesFromProducts(products: ProductData[]): number | undefined;
/** 是否存在 capacity.type === 'custom' 的商品 */
export declare function hasCustomCapacityProduct(products: ProductData[]): boolean;
/**
 * 根据预约规则商品的 resource.type 计算桌台是否已被"占满"。
 * - single：只要有 `lastOrderId` 即视为占用
 * - multiple：当前时间落在 `capacity_list[i]` 的 `[start_at, end_at]`（inclusive）内的 pax 之和 >= 总容量
 * - 其他（'capacity' / undefined）：返回 false，不施加限制
 */
export declare function computeResourceIsFull(params: {
    resourceSelectType?: ScanOrderResourceSelectType;
    lastOrderId?: string;
    capacityList?: ScanOrderResourceCapacitySlot[];
    capacity?: number | string | null;
}): boolean;
/**
 * 在商品列表中找到第一个 `capacity.type === 'custom'` 的商品，取其 `custom` 数组第一项的 min/max。
 * 仅返回有限数字字段；若均无法解析则返回 `undefined`。
 */
export declare function pickFirstCustomCapacityPaxBounds(products: ProductData[]): {
    min?: number;
    max?: number;
} | undefined;
/**
 * 第一个 `capacity.type === 'custom'` 的商品，取其 `custom[0].id`（提交 booking metadata.capacity 维度 id）。
 * 无匹配时返回 `undefined`，调用方应回退为 `0`。
 */
export declare function pickFirstCustomCapacityDimensionId(products: ProductData[]): string | number | undefined;
