import Decimal from 'decimal.js';
import { CartItem } from "../Cart";
import type { OrderProductDiscountItem, OrderSubmitPayload, OrderSubmitProduct, OrderSummary, OrderTempOrder } from './types';
import type { RulesParamsHooks } from '../Rules/types';
import type { MapOrderPaymentsOptions, OrderPaymentData, OrderPaymentSource } from './types';
/**
 * 把"含 option 的主商品单价"与 bundle 合成"单行 composite 单价"。
 *
 * 新语义 v2 约定：
 * - `mainPrice` 必须是**已经包含 option 的主商品单价**（即 `metadata.main_product_selling_price`
 *   或 `metadata.main_product_original_price`），option 价格不由本函数叠加。
 * - 套餐价：Σ((bundle.bundle_selling_price ?? bundle.price) × (bundle.num ?? bundle.quantity ?? 1))
 *   当 `useOriginalBundle=true` 时，改用 `bundle.original_price ?? bundle.product_price ?? bundle.price`。
 * - 返回值：保留 2 位小数的字符串，方便直接写回 `selling_price` / `original_price` 字段。
 *
 * 被 `normalizeOrderProduct`、Rules setProduct 钩子、各 Solution 的 setDiscountSelected 共用，
 * 保证合成逻辑单点来源。
 */
export declare function composeLinePrice(params: {
    mainPrice: string | number | null | undefined;
    bundle?: Array<{
        bundle_selling_price?: any;
        price?: any;
        num?: any;
        quantity?: any;
        original_price?: any;
        product_price?: any;
    }> | null;
    useOriginalBundle?: boolean;
}): string;
/**
 * 计算 option 单价合计：Σ(option.price × option.num)。
 * 在新语义 v2 下，main_product_original_price = source_product_price + 本函数结果。
 */
export declare function sumOptionUnitPrice(options?: Array<{
    price?: any;
    num?: any;
}> | null): Decimal;
/**
 * OrderModule 默认 Rules 钩子工厂。
 *
 * 价格语义约定（订单域，v2 composite 口径）：
 * - `selling_price`：券后 **行 composite 单价**
 *   = `metadata.main_product_selling_price` + Σ(bundle_selling_price × num)。
 * - `original_price`：券前 **行 composite 单价**
 *   = `metadata.main_product_original_price` + Σ(bundle 原价 × num)。
 * - `metadata.source_product_price`：主商品/variant 基础价（已应用报价单），不含 option、
 *   不含折扣。**权威源**。
 * - `metadata.main_product_original_price` = source + Σ(option.price × option.num)（含 option、不含折扣）。
 * - `metadata.main_product_selling_price` = main_original − 主商品券 per-unit amount（含 option、含折扣）。
 * - `payment_price`：出站 payload 中由 `selling_price` 派生以兼容后端（composite）。
 *
 * Rules 钩子契约（hook_adapt 方案，Rules 内部保持不变）：
 * - `getProduct.price` / `getProduct.original_price` 回传 **source-level 主价**
 *   （`metadata.source_product_price`）。Rules 内部 `getProductTotalPrice` /
 *   `getProductOriginTotalPrice` 会自行叠加 option + bundle，喂 source 可避免 option 双加。
 * - `getProduct.total` = `selling_price × num`（行 composite × num），与 Rules 内部产出的
 *   total（source + option + bundle）对齐。
 * - `setProduct` 反向流程：把 Rules 返回的 source-level `main_product_selling_price` / `price`
 *   加回 Σoptions，重新合成含 option 的 main_product_* 并派生 composite。
 *   优先级：
 *     1. `values.main_product_selling_price`（券应用分支，per-unit 券后 source-level 主价）
 *     2. `values.price`（还原分支 `restoredPrice`、good_pass 归零）
 *     3. `values.total / num`（仅当 Rules 只给出总价时的兜底）
 *
 * 导出为纯函数方便单测直接驱动钩子，不依赖 OrderModule 实例。
 */
/** Rules calcDiscount 用手动价标记；undefined 表示交给 Rules 用 total/origin_total 推断 */
export declare function resolveRulesManualDiscountFlag(metadata: Record<string, any> | null | undefined): boolean | undefined;
/**
 * 商品行折扣只保留后端 OrderProductDiscountItem 协议字段。
 * Rules/券计算过程中的 `_num`、`config` 等运行态字段不应进入 tempOrder 或提交 payload。
 */
export declare function normalizeOrderProductDiscountList(discountList?: unknown[] | null): OrderProductDiscountItem[];
/**
 * 手动改价（price_override）时行级 original_price（composite 单价）：
 * 购物车划线价应对齐 metadata.origin._extend.origin_total（改价前单价 composite，如 40），
 * 而非 bundle 子项 catalog 原价合成的 composedOriginalPrice（如 30）。
 *
 * origin_total 与 SkuDetailModal / cacheItem._extend 一致，为单价语义，不再除以 num。
 */
export declare function resolveManualOverrideLineOriginalPrice(params: {
    num?: number;
    metadata?: Record<string, any> | null;
    /** 已有行级 original_price（origin 被裁剪时兜底划线价） */
    lineOriginalPrice?: string | number | null;
}, fallbackCompositeOriginal: string): string;
export declare function createDefaultOrderRulesHooks(): RulesParamsHooks;
/**
 * 通过 session 类商品的开始时间结束时间生成商品的时长
 * @param {CartItem} cartItem
 * @return {*}
 */
export declare const generateDuration: (cartItem: CartItem) => {
    duration: number;
    durationType: string;
};
/**
 * 合并关联表单
 * @param relationForms 关联表单
 * @returns 合并后的关联表单
 */
export declare const mergeRelationForms: (relationForms: {
    form_id: number;
    form_record_ids: number[];
}[]) => {
    form_id: number;
    form_record_ids: number[];
}[];
export declare const getAllDiscountList: (cartItem: CartItem) => any;
export declare function createUuidV4(): string;
export declare function isTempOrder(data: any): data is OrderTempOrder;
export declare function formatDateTime(date: Date): string;
export declare function normalizeBookingIsAll(booking: Record<string, any>): 0 | 1;
export declare function normalizeBookingSubType(booking: Record<string, any>): string;
export declare function normalizeSubmitBooking<T extends {
    metadata?: Record<string, any>;
}>(booking: T): T;
/** 提交用人数：有限且为正则向下取整，否则为 1 */
export declare function normalizeSubmitCollectPaxValue(value: unknown): number;
/** 从临时订单 metadata 解析合成 booking 的 collect_pax */
export declare function resolveSubmitCollectPax(tempOrder: OrderTempOrder): number;
export declare function createDefaultTempOrder(params: {
    now: string;
    summary?: OrderSummary;
}): OrderTempOrder;
export interface SubmitPayloadEnhancerContext {
    tempOrder: OrderTempOrder;
    bookingUuid: string;
    now: Date;
}
export type SubmitPayloadEnhancer = (payload: OrderSubmitPayload, ctx: SubmitPayloadEnhancerContext) => OrderSubmitPayload;
export declare function buildSubmitPayload(params: {
    tempOrder: OrderTempOrder;
    cacheId?: string;
    now?: Date;
    platform?: string;
    businessCode?: string;
    channel?: string;
    type?: string;
    enhance?: SubmitPayloadEnhancer;
}): OrderSubmitPayload;
export declare function mapPaymentItemToOrderPayment(paymentItem: OrderPaymentSource): OrderPaymentData;
export declare function mapPaymentItemsToOrderPayments(paymentItems: OrderPaymentSource[], options?: MapOrderPaymentsOptions): OrderPaymentData[];
/**
 * 历史 V1 加餐结构映射器。
 *
 * @deprecated 标准 Sales checkout 已统一提交结构。
 * 本函数仅保留以兼容历史接入方，未来会移除。新代码请勿再调用。
 */
export declare function formatV1Product(products: OrderSubmitProduct[]): {
    bundle: any[];
    key: number | null;
    option: any;
    product_id: number | null;
    product_variant_id: number;
    num: number;
    note: string;
    rowKey: number | null;
    session: null;
    unique: string;
}[];
export { createEmptySummary } from '../../solution/ScanOrder/utils';
export { buildManualProductDiscountItem, ensureManualProductDiscountList, findManualProductDiscountItem, mergeManualProductDiscountIntoList, resolveManualDiscountMessage, resolveManualDiscountOriginTotal, resolveManualDiscountReasonFromSources, resolveSafeProductNum, shouldBuildManualProductDiscount, syncManualProductDiscountProductNum, stripManualProductDiscountItems, } from './utils/manualProductDiscount';
export type { ManualProductDiscountItem } from './utils/manualProductDiscount';
