import { StrategyConfig } from '../../type';
/**
 * Promotion 策略类型定义
 *
 * 定义促销活动相关的 Action 类型、值结构和配置
 */
/**
 * 促销活动 Action 类型
 */
export declare const PROMOTION_ACTION_TYPES: {
    /** X件Y元（每X件固定价格Y元，可累计） */
    readonly X_ITEMS_FOR_Y_PRICE: "X_ITEMS_FOR_Y_PRICE";
    /** 买X送Y（买X件送Y件，可累计） */
    readonly BUY_X_GET_Y_FREE: "BUY_X_GET_Y_FREE";
    /** 固定折扣 */
    readonly DISCOUNT_RATE: "DISCOUNT_RATE";
    /** 固定减价 */
    readonly DEDUCT_AMOUNT: "DEDUCT_AMOUNT";
};
export type PromotionActionType = (typeof PROMOTION_ACTION_TYPES)[keyof typeof PROMOTION_ACTION_TYPES];
/**
 * X件Y元 - Action Value
 *
 * @example
 * value: { x: 2, price: 10 }  // 每2件10元
 */
export interface XItemsForYPriceValue {
    /** 每X件（需要凑满的数量） */
    x: number;
    /** 固定价格Y元 */
    price: number;
}
/**
 * X件Y元 - Action Config
 */
export interface XItemsForYPriceConfig {
    /** 允许跨商品组合（A+B可以凑成一组） */
    allowCrossProduct?: boolean;
    /** 可累计（买5件 = 2组优惠 + 1件原价） */
    cumulative?: boolean;
}
/**
 * 买X送Y - Action Value
 *
 * @example
 * value: { buyQuantity: 1, freeQuantity: 1 }  // 买1送1
 */
export interface BuyXGetYFreeValue {
    /** 买X件 */
    buyQuantity: number;
    /** 送Y件 */
    freeQuantity: number;
}
/**
 * 赠品选择模式
 */
export type GiftSelectionMode = 'user_select' | 'auto' | 'cheapest';
/**
 * 买X送Y - Action Config
 */
export interface BuyXGetYFreeConfig {
    /** 赠品选择模式 */
    giftSelectionMode?: GiftSelectionMode;
    /** 可累计（买2送2、买3送3...） */
    cumulative?: boolean;
    /** 可选的赠品列表 */
    giftProducts?: ProductIdentifier[];
}
/**
 * 商品标识
 *
 * 匹配规则：
 * - product_variant_id = 0 表示匹配任意变体
 * - product_variant_id != 0 表示精确匹配该变体
 */
export interface ProductIdentifier {
    /** 商品ID */
    product_id: number;
    /**
     * 变体ID
     * - 0 表示匹配任意变体
     * - 非0 表示精确匹配该变体
     */
    product_variant_id: number;
}
import { ActionEffect } from '../../type';
/**
 * X件Y元 Action
 */
export interface XItemsForYPriceAction extends Omit<ActionEffect, 'type' | 'value' | 'config'> {
    type: typeof PROMOTION_ACTION_TYPES.X_ITEMS_FOR_Y_PRICE;
    value: XItemsForYPriceValue;
    valueType: 'object';
    config?: XItemsForYPriceConfig;
}
/**
 * 买X送Y Action
 */
export interface BuyXGetYFreeAction extends Omit<ActionEffect, 'type' | 'value' | 'config'> {
    type: typeof PROMOTION_ACTION_TYPES.BUY_X_GET_Y_FREE;
    value: BuyXGetYFreeValue;
    valueType: 'object';
    config?: BuyXGetYFreeConfig;
}
/**
 * 促销活动 Action 联合类型
 */
export type PromotionAction = XItemsForYPriceAction | BuyXGetYFreeAction;
/**
 * 促销相关运算符
 */
export declare const PROMOTION_OPERATORS: {
    /**
     * 商品匹配运算符
     *
     * 匹配规则：
     * - 首先匹配 product_id
     * - 如果配置的 product_variant_id = 0，只需要 product_id 匹配
     * - 如果配置的 product_variant_id != 0，还需要 product_variant_id 匹配
     */
    readonly PRODUCT_MATCH: "product_match";
};
/**
 * 促销活动业务数据
 *
 * 由业务层传入，用于策略评估
 */
export interface PromotionBusinessData {
    /** 商品列表 */
    products: PromotionProduct[];
    /** 当前评估的商品（用于单商品场景，如商品卡片展示） */
    currentProduct?: PromotionProduct;
    /** 渠道 */
    channel?: string;
    /** 自定义属性 */
    custom?: Record<string, any>;
}
type ProductBundleItem = {
    /** 主商品ID */
    product_id: number;
    /** 变体ID（0 表示无变体） */
    product_variant_id: number;
    /** 数量 */
    quantity: number;
    /** 单价 */
    price: number;
    /** 原价 */
    original_price?: number;
    /** 套餐明细id */
    id: number;
    /** 套餐商品id */
    _bundle_product_id: number;
};
/**
 * 促销商品信息
 */
export interface PromotionProduct {
    id: number;
    /** 商品ID */
    product_id: number;
    /** 变体ID（0 表示无变体） */
    product_variant_id: number;
    /** 商品名称 */
    name?: string;
    /** 单价 */
    price: number;
    /** 商品套餐 */
    bundle: ProductBundleItem[];
    /** 数量 */
    quantity: number;
    /** 原价 */
    original_price?: number;
}
/**
 * 促销活动适配器转换结果
 *
 * 返回给业务层，包含策略匹配信息
 */
export interface PromotionTransformResult {
    /** 策略是否适用 */
    isApplicable: boolean;
    /** 匹配的 Action 类型 */
    actionType?: PromotionActionType;
    /** 匹配的 Action 详情 */
    actionDetail?: PromotionActionDetail;
    /** 适用的商品列表（从购物车商品中筛选出的适用商品） */
    applicableProducts: PromotionProduct[];
    /** 不适用的原因 */
    reason?: string;
    /** 不适用的原因码 */
    reasonCode?: string;
    /** 原始策略引擎结果 */
    strategyResult: import('../../type').EvaluationResult;
}
/**
 * Action 详情联合类型
 */
export type PromotionActionDetail = XItemsForYPriceActionDetail | BuyXGetYFreeActionDetail;
/**
 * X件Y元 Action 详情
 */
export interface XItemsForYPriceActionDetail {
    type: typeof PROMOTION_ACTION_TYPES.X_ITEMS_FOR_Y_PRICE;
    /** 每X件 */
    x: number;
    /** 固定价格Y元 */
    price: number;
    /** 允许跨商品组合 */
    allowCrossProduct: boolean;
    /** 可累计 */
    cumulative: boolean;
}
/**
 * 买X送Y Action 详情
 */
export interface BuyXGetYFreeActionDetail {
    type: typeof PROMOTION_ACTION_TYPES.BUY_X_GET_Y_FREE;
    /** 买X件 */
    buyQuantity: number;
    /** 送Y件 */
    freeQuantity: number;
    /** 赠品选择模式 */
    giftSelectionMode: GiftSelectionMode;
    /** 可累计 */
    cumulative: boolean;
    /** 可选的赠品列表 */
    giftProducts: ProductIdentifier[];
}
/**
 * X件Y元 - 业务层计算结果
 *
 * 由业务层根据 matchedAction 计算后返回
 */
export interface XItemsForYPriceResult {
    /** 满足条件的组数 */
    groupCount: number;
    /** 剩余件数（原价） */
    remainingCount: number;
    /** 优惠金额 */
    discountAmount: number;
    /** 分组详情 */
    groups: Array<{
        products: Array<{
            product_id: number;
            product_variant_id: number;
            originalPrice: number;
        }>;
        originalTotal: number;
        discountedPrice: number;
    }>;
}
/**
 * 买X送Y - 业务层计算结果
 *
 * 由业务层根据 matchedAction 计算后返回
 */
export interface BuyXGetYFreeResult {
    /** 可送的赠品数量 */
    freeCount: number;
    /** 需要用户选择的赠品数量 */
    pendingSelectCount: number;
    /** 已选择的赠品 */
    selectedGifts: ProductIdentifier[];
    /** 可选的赠品列表 */
    availableGifts: ProductIdentifier[];
}
/**
 * 评估器输入
 */
export interface PromotionEvaluatorInput {
    /** 商品列表 */
    products: PromotionProduct[];
    /** 策略配置列表（可选，如果不传则使用 setStrategyConfigs 设置的） */
    strategyConfigs?: StrategyConfig[];
    /** 渠道 */
    channel?: string;
}
/**
 * 单商品评估结果
 */
export interface ProductPromotionResult {
    /** 商品信息 */
    product: PromotionProduct;
    /** 适用的促销列表 */
    applicablePromotions: ApplicablePromotion[];
    /** 是否有适用的促销 */
    hasPromotion: boolean;
}
/**
 * 适用的促销信息
 */
export interface ApplicablePromotion {
    /** 策略ID */
    strategyId: string;
    /** 策略名称 */
    strategyName: string | Record<string, string>;
    /** Action 类型 */
    actionType: string;
    /** Action 详情 */
    actionDetail: PromotionActionDetail;
    /** 展示配置 */
    display?: {
        text: string | Record<string, string>;
        type: string;
    };
    /** 原始策略配置 */
    strategyConfig: StrategyConfig;
    /** 匹配的 bundle 子商品索引（如果是 bundle 子商品匹配） */
    matchedBundleIndex?: number;
    /** 满足促销所需的商品数量 */
    requiredQuantity?: number;
    /** 参与促销的商品列表 */
    eligibleProducts?: ProductIdentifier[];
}
/**
 * 购物车评估结果
 */
export interface CartEvaluationResult {
    /** 每个商品的促销结果 */
    productResults: ProductPromotionResult[];
    /** 购物车中所有适用的促销（去重） */
    applicablePromotions: CartApplicablePromotion[];
    /** 按促销分组的商品 */
    promotionGroups: PromotionGroup[];
}
/**
 * 购物车适用的促销
 */
export interface CartApplicablePromotion extends ApplicablePromotion {
    /** 适用此促销的商品列表 */
    applicableProducts: PromotionProduct[];
    /** 适用商品的总数量 */
    totalQuantity: number;
    /** 适用商品的总金额 */
    totalAmount: number;
    /** 商品ID -> 匹配的 bundle 子商品索引映射 */
    productMatchedBundleIndexMap?: Map<number, number | undefined>;
}
/**
 * 促销分组
 */
export interface PromotionGroup {
    /** 策略ID */
    strategyId: string;
    /** 策略名称 */
    strategyName: string | Record<string, string>;
    /** 策略元数据 */
    strategyMetadata?: StrategyConfig['metadata'];
    /** 原始策略配置 */
    strategyConfig?: StrategyConfig;
    /** Action 类型 */
    actionType: string;
    /** Action 详情 */
    actionDetail: PromotionActionDetail;
    /** 分组内的商品 */
    products: PromotionProduct[];
    /** 商品总数量 */
    totalQuantity: number;
    /** 商品总金额 */
    totalAmount: number;
    /** 商品ID -> 匹配的 bundle 子商品索引映射 */
    productMatchedBundleIndexMap?: Map<number, number | undefined>;
}
/**
 * 带定价的商品
 *
 * 在 PromotionProduct 基础上增加了均摊后的最终价格和促销信息
 */
export interface PricedProduct extends PromotionProduct {
    /**
     * 原始商品ID
     * 当商品被拆分时，此字段记录拆分前的原始商品id
     * 例如 A*5 拆成 A*4（参与促销）+ A*1（原价），A*4 的 originalId 指向原始 A 的 id
     */
    originalId?: number;
    /**
     * 最终单价（均摊后）
     * - 参与促销的商品：按原价比例均摊后的价格
     * - 未参与促销的商品：等于 price
     */
    finalPrice: number;
    /**
     * 应用的策略ID
     * 如果商品参与了促销，记录对应的策略ID
     */
    strategyId?: string;
    /**
     * 应用的策略元数据
     * 如果商品参与了促销，记录对应策略的 metadata
     */
    strategyMetadata?: StrategyConfig['metadata'];
    /**
     * 是否参与了促销
     */
    inPromotion: boolean;
    /**
     * 是否为拆分出来的商品
     * true 表示这是从原商品拆分出来的新记录
     */
    isSplit?: boolean;
    /**
     * 匹配的 bundle 子商品索引
     * 如果促销匹配的是 bundle 子商品而非主商品，记录对应的 bundle 索引
     * undefined 表示匹配的是主商品
     */
    matchedBundleIndex?: number;
}
/**
 * 赠品信息
 *
 * 记录某个促销产生的赠品数量和可选赠品列表
 */
export interface GiftInfo {
    /** 策略ID */
    strategyId: string;
    /** 策略名称 */
    strategyName: string | Record<string, string>;
    /** 可送赠品数量 */
    giftCount: number;
    /** 可选赠品列表 */
    giftOptions: ProductIdentifier[];
}
/**
 * 带定价的购物车评估结果
 *
 * evaluateCartWithPricing 方法的返回结果
 */
export interface CartWithPricingResult {
    /**
     * 处理后的商品数组
     * - 包含所有商品（参与促销和未参与促销的）
     * - 参与促销的商品可能被拆分（如 A*5 拆成 A*4 + A*1）
     * - 每个商品都有 finalPrice 字段
     */
    products: PricedProduct[];
    /**
     * 赠品信息列表
     * 按促销分组，每个促销对应一个 GiftInfo
     */
    gifts: GiftInfo[];
    /**
     * 总优惠金额
     * 所有商品的原价总和 - 所有商品的 finalPrice 总和
     */
    totalDiscount: number;
}
export {};
