/// <reference types="react" />
import type { Dayjs } from 'dayjs';
/** 场地预订步骤枚举 */
export declare type VenueBookingStepKey = 'select-venue' | 'addons' | 'checkout';
/** 场地预订组件入口 props */
export interface VenueBookingProps {
    biz?: string;
    resource_id?: string;
}
/** 标准化后的入口上下文（从 engine props 提取） */
export interface VenueBookingEntryContext {
    biz: string;
    resource_id?: string;
}
/** 单个时段（来自 getTimeSlotGrid） */
export interface VenueResourceSlot {
    startTime: string;
    endTime: string;
    status: 'past' | 'occupied' | 'available' | 'partially_occupied' | 'unavailable';
    price: string | null;
    /** per-product 子行的 slot 带 productId；外层合并 slot 不带 */
    productId?: number;
}
/** 多商品共享一个 resource 时的子行 */
export interface VenueResourceSubRow {
    productId: number;
    productTitle: string;
    price: string;
    slots: VenueResourceSlot[];
}
/** 单个资源/场地（来自 getTimeSlotGrid） */
export interface VenueResource {
    resourceId: number;
    resourceName: string;
    /** 单商品时唯一；多商品时取第一个（兼容字段，请优先使用 products） */
    productId: number;
    productTitle: string;
    slots: VenueResourceSlot[];
    /** 多商品子行；仅当 hasMultipleProducts 时存在 */
    products?: VenueResourceSubRow[];
    hasMultipleProducts?: boolean;
    /** 组合资源元信息（combined_resource.status === 1） */
    combinedResource?: {
        resourceIds: Array<number | string>;
    };
}
/** 日期时段网格（来自 getTimeSlotGrid） */
export interface VenueTimeSlotGrid {
    date: string;
    timeLabels: string[];
    resources: VenueResource[];
}
/** 日期概览（来自 getDateRangeSummary） */
export interface VenueDateSummaryItem {
    date: string;
    status: 'available' | 'few_left' | 'sold_out' | 'unavailable';
    startingPrice: string | null;
    totalSlots: number;
    availableSlots: number;
}
/** 时段价格信息（用于 TimeGrid 渲染样式） */
export interface SlotPriceInfo {
    price: number;
    originalPrice: number | null;
    label: string;
    highlight: boolean;
}
/** 时段标签（Off-Peak / Promo 等） */
export interface SlotTag {
    text: string;
    className: string;
}
/** 日期元数据（用于 DayTabs 展示状态标签） */
export interface DateMeta {
    topTag: string | null;
    startingPrice: string | null;
    fewLeft: boolean;
    soldOut: boolean;
    unavailable: boolean;
}
/** 场地维度的可用性概况 */
export interface CourtMeta {
    soldOut: boolean;
    fewLeft: boolean;
}
/** 时段维度的可用性概况 */
export interface TimeMeta {
    soldOut: boolean;
    fewLeft: boolean;
}
/**
 * 视图模型 -- 聚合场地数据 + OS 模块数据
 * dateSummary / timeSlotGrid 来自 PisellOS venueBooking 模块
 * cartItems / summary / note 从 OS 模块快照构建
 */
export interface VenueBookingViewModel {
    /** 一周日期概览（状态 + 起步价） */
    dateSummary: VenueDateSummaryItem[];
    /** 当前选中日期的时段网格（资源 × 时段） */
    timeSlotGrid: VenueTimeSlotGrid | null;
    /** 购物车商品列表（ShoppingCart 组件所需格式） */
    cartItems: any[];
    /** 金额汇总对象（total_amount / tax_fee 等） */
    summary: Record<string, any>;
    /** 订单备注 */
    note: string;
    /** 联系人信息（tempOrder.contacts_info） */
    contactsInfo: any[];
    /** 场地商品列表（来自 loadVenueProducts / getVenueProducts） */
    venueProducts: any[];
    /** 附加商品列表（缓存在 context 中，避免步骤切换时丢失） */
    addonProductList: any[];
}
/** Context 暴露给所有子组件的完整值类型 */
export interface VenueBookingContextValue {
    /** PisellOS venueBooking 模块实例 */
    venueBookingModule: any;
    /** 当前步骤 */
    currentStep: VenueBookingStepKey;
    /** 步骤列表 */
    stepList: VenueBookingStepKey[];
    /** 聚合视图模型 */
    viewModel: VenueBookingViewModel;
    /** 日历锚点日期 */
    anchorDate: Dayjs;
    /** 场地类型筛选器 */
    filter: string;
    /** 场地搜索关键字 */
    search: string;
    /** 数据加载中（初始 bootstrap） */
    isLoading: boolean;
    /** 周视图（dateSummary）加载中：拉取一周场地概览网络请求期间为 true */
    isWeekLoading: boolean;
    /** 时段网格（timeSlotGrid）加载中：切换日期 / 切换周时短暂为 true */
    isGridLoading: boolean;
    /** 预订上限提示信息 */
    limitMessage: string;
    /** 移动端购物车抽屉是否展开 */
    mobileCartOpen: boolean;
    /** 月份选择器是否展开 */
    monthPickerOpen: boolean;
    /** 月份选择器当前游标月份 */
    monthCursor: Dayjs;
    /** 是否满足进入下一步的条件 */
    canNext: boolean;
    /** 购物车校验状态（从 OS 事件同步） */
    cartValidation: {
        passed: boolean | null;
        failures: any[];
    };
    /** Footer 操作按钮文案 */
    footerActionText: string;
    /** 下单提交中状态 */
    isSubmittingOrder: boolean;
    /** 是否已登录 */
    isLogin: boolean;
    /** 打开登录弹窗 */
    openLoginModal: (params: {
        callback: (status: string) => void;
    }) => void;
    /** 当前折扣/优惠券列表 */
    discountList: any[];
    /** 定金协议是否已勾选 */
    isAgreeDepositPolicy: boolean;
    /** 设置定金协议勾选状态 */
    setIsAgreeDepositPolicy: (val: boolean) => void;
    /** 步骤导航：跳转到指定步骤 */
    goToStep: (step: VenueBookingStepKey) => void;
    /** 步骤导航：下一步 */
    nextStep: () => void;
    /** 步骤导航：上一步 */
    prevStep: () => void;
    setAnchorDate: (date: Dayjs) => void;
    setFilter: (filter: string) => void;
    setSearch: (search: string) => void;
    setLimitMessage: (msg: string) => void;
    setMobileCartOpen: (open: boolean) => void;
    setMonthPickerOpen: (open: boolean) => void;
    setMonthCursor: (cursor: Dayjs) => void;
    setFooterActionText: (text: string) => void;
    /** 切换选中/取消某个时段（调用 OS venueBooking.toggleSlot） */
    toggleSlot: (resourceId: number, productId: number, slot: VenueResourceSlot) => Promise<void>;
    /** 刷新 OS 模块视图模型（调用 getSummary + 重建 viewModel），可选传入额外字段合并 */
    refreshViewModel: (extraFields?: Partial<VenueBookingViewModel>) => Promise<void>;
    /** 拉取指定周的资源数据并刷新 dateSummary + timeSlotGrid */
    fetchWeekData: (startDate: string, endDate: string) => Promise<void>;
    /** 从指定日期开始自动跳转到最近可用日期（必要时自动滚到后续周） */
    goToNearestAvailableDate: (fromDate: Dayjs) => Promise<void>;
    /** 刷新当前日期的 timeSlotGrid */
    refreshTimeSlotGrid: (date?: string) => void;
    /** 安全调用 OS 模块方法的快捷入口 */
    runModuleAction: (actionName: string, ...args: any[]) => Promise<any>;
    /** 更新订单备注到 OS 模块 */
    updateOrderNote: (note: string) => Promise<void>;
    /** 主操作按钮行为（根据当前步骤不同执行不同逻辑） */
    handlePrimaryAction: () => void;
    /** 结账步骤提交订单 */
    handleSubmitOrder: () => Promise<void>;
}
/** Provider 组件的 props */
export interface VenueBookingProviderProps {
    entryContext: VenueBookingEntryContext;
    children: React.ReactNode;
}
