import { type Dayjs } from 'dayjs';
import { type TimeRangeOption } from '@pisell/materials';
/** 避免 `?? []` 每次 render 新数组引用，触发依赖 list 的 effect 死循环 */
export declare const EMPTY_RESERVATION_LIST: unknown[];
export declare function bookingWindowClockOrDefault(operatingDayBoundary?: unknown): string;
/**
 * 营业日锚定：`core.operating_day_boundary`。
 * - `start_time`：选中日 D 的营业窗为 [D 界钟, 次日同钟)；
 * - `end_time`：选中日 D 表示营业在 D 的界钟结束，窗为 [D−1 界钟, D 界钟)；
 * 无有效界钟时与 {@link RESERVATION_TIMELINE_BUSINESS_RANGE} 一致（02:00）。
 */
export declare function bookingTimeWindowForAnchorDay(anchorDay: Dayjs, operatingDayBoundary?: unknown): [Dayjs, Dayjs];
/**
 * 平面图 / 列表 `booking_time_start_between` 与时间轴可视营业窗对齐。
 *
 * - 顶栏日历日 == 自然「今天」：与 TimeNavigator 一致，用 {@link pickReferenceDateContainingNow}
 *   + {@link getRangeBounds}（保证凌晨仍落在上一营业日窗内的预约能进画布）；
 * - 其它选中日：仍用 {@link bookingTimeWindowForAnchorDay}（按营业边界类型锚定）。
 */
export declare function bookingTimeWindowForReservationView(scheduleDate: Dayjs, operatingDayBoundary: unknown | undefined, timelineRange?: TimeRangeOption, 
/** 墙钟；须与 TimeNavigator 内 `pickReferenceDateContainingNow(range, dayjs())` 一致，勿用游标 `at` */
wallClock?: Dayjs): [Dayjs, Dayjs];
/**
 * 日历跨日视口：与单日营业窗按日首尾相接。
 * - `start_time`：rangeStart 界钟 → rangeEnd 次日界钟；
 * - `end_time`：rangeStart−1 日界钟 → rangeEnd 当日界钟。
 */
export declare function bookingTimeWindowForCalendarRange(rangeStart: Date, rangeEnd: Date, operatingDayBoundary?: unknown): [Dayjs, Dayjs];
/**
 * Monitor / 平面图列表初始筛：支付态 + 锚定营业日 `booking_time_start_between`。
 */
export declare function getDefaultMonitorSearchParams(anchorDay?: Dayjs, operatingDayBoundary?: unknown, timelineRange?: TimeRangeOption, now?: Dayjs): Record<string, unknown>;
/**
 * 表格视图初始筛选项：与 Sales Monitor 一致——支付态 + **今日营业日窗口**。
 * 传入店铺 `operating_day_boundary` 时与时间轴界钟一致。
 */
export declare function getGridTableBookingSearchParams(operatingDayBoundary?: unknown, timelineRange?: TimeRangeOption): Record<string, unknown>;
export interface UsePisellReservationBookingDataOptions {
    /** 列表单页条数；平面图按日合并台位时宜用大页 */
    listPageSize?: number;
    /** 初始筛选项；不传则与 Sales Monitor 一致（含当前营业日预约窗口） */
    getInitialSearchParams?: () => Record<string, unknown>;
    /**
     * 合并进每次请求的扁平参数（在 `filter.values` 展开之后），如平面图
     * `form_record_ids: number[]` 按当前资源桌筛选预约。
     */
    extraRequestParams?: Record<string, unknown>;
    /**
     * 是否启用列表 WebSocket 推送并用 `mutate` 覆盖当前数据（`osServer` + `subscriberId`）。
     * 表格全量/分页必须与接口 HTTP 结果一致，应设为 `false`：推送常为平面图子集（如仅绑定桌），
     * 会覆盖刚返回的整页列表，表现为「请求 50 条只显示几条且像平面图资源」。
     * 平面图合并用 booking 请求可保持默认 `true`。
     */
    subscribeRealtimePush?: boolean;
}
/** 内置列表数据 hook 返回结构（booking / resource 页共用） */
export interface UsePisellReservationBookingDataResult {
    data: unknown[];
    loading: boolean;
    total: number;
    pagination: {
        pageNumber: number;
        pageSize: number;
    };
    onPageChange: (pageNumber: number, pageSize: number) => void;
    searchParams: Record<string, unknown>;
    onSearch: (params: Record<string, unknown>) => void;
    onReset: () => void;
    refresh: () => void;
    refreshAsync: () => Promise<unknown>;
    /** 函数式合并 searchParams 并重置到第一页（用于日程变更） */
    patchSearchParams: (updater: (prev: Record<string, unknown>) => Record<string, unknown>) => void;
    /**
     * WS 推送 mutate 后的累计版本号；下游 hook（如 `useReservationSalesHostData`）
     * 把它作为 effect dep，可保证「即使 booking 内容字段未触发 cheap hash 变化，
     * 也能在每次推送后重新拉取宿主 sales 列表」，避免画布在 push 后不刷新。
     */
    pushDataVersion: number;
}
export declare function usePisellReservationBookingData(enabled: boolean, options?: UsePisellReservationBookingDataOptions): UsePisellReservationBookingDataResult;
