import type { PromoStackingMode } from '../checkout/sessionMetadataV5.js'; export type PromoLoyaltyApplicationOrder = 'NONE' | 'PROMO_ONLY' | 'LOYALTY_ONLY' | 'PROMO_THEN_LOYALTY'; export interface ResolvePromoLoyaltyStackInput { readonly stackingMode: PromoStackingMode; readonly activatedPromoRewardId?: string | null; readonly activatedCouponId?: string | null; /** Major-currency promo discount from preview (optional; used for totals). */ readonly promoDiscountAmount?: number; /** Major-currency loyalty discount from preview (optional; used for totals). */ readonly loyaltyDiscountAmount?: number; } export interface ResolvePromoLoyaltyStackResult { /** False when EXCLUSIVE and both instruments are present (apply must 409). */ readonly allowed: boolean; readonly mutualExclusion: boolean; readonly mutualExclusionCode: 'PROMO_LOYALTY_MUTUAL_EXCLUSION' | null; /** HTTP hint for apply/remove conflict surfaces. */ readonly httpStatus: 409 | null; readonly applicationOrder: PromoLoyaltyApplicationOrder; readonly effectiveActivatedPromoRewardId: string | null; readonly effectiveActivatedCouponId: string | null; /** * Preview total: STACK sums both; EXCLUSIVE uses max when conflict unresolved, * otherwise the single active instrument amount. */ readonly totalDiscountAmount: number; } /** * Resolve promo โ†” loyalty stacking for apply / preview / remove UX (plan ยง3.16). * * - EXCLUSIVE + both present โ†’ mutual exclusion (`PROMO_LOYALTY_MUTUAL_EXCLUSION` / 409). * - STACK_PROMO_THEN_LOYALTY โ†’ promo first, then loyalty on residual (both effective). * - Remove code clears promo only; loyalty remains when still eligible (callers pass * `activatedPromoRewardId: null` after remove). */ export declare function resolvePromoLoyaltyStack(input: ResolvePromoLoyaltyStackInput): ResolvePromoLoyaltyStackResult; //# sourceMappingURL=resolvePromoLoyaltyStack.d.ts.map