import dayjs from 'dayjs';
import { Module, ModuleOptions, PisellCore } from '../../types';
import { BaseModule } from '../../modules/BaseModule';
import type { RequestPlugin } from '../../plugins/request';
import { SalesState, SalesModuleAPI, Reservation, SalesResourceBookingItem, SalesResourceBookingItemWithGroups, SalesTimelineHighlights, ChangeBookingStatusParams, GetResourceBookingItemParams } from './types';
import type { BookingData } from '../../server/modules/order/types';
export * from './types';
/**
 * Sales 解决方案基础骨架
 *
 * 当前阶段仅提供：
 * - solution 目录结构
 * - 标准入口导出
 * - 基础生命周期占位
 *
 * 不提前实现 store 编排、初始化流程细节、状态计算逻辑。
 * TIPS：这块应该改名叫 ReservationModule 更合适一些，目前这边只服务于 Reservation 的 floormap 展示。
 */
export declare class SalesImpl extends BaseModule implements Module, SalesModuleAPI {
    protected defaultName: string;
    protected defaultVersion: string;
    protected defaultTimelineBucketMinutes: number;
    isSolution: boolean;
    protected store: SalesState;
    protected options: ModuleOptions;
    protected otherParams: Record<string, any>;
    protected request: RequestPlugin;
    private logger;
    constructor(name?: string, version?: string);
    initialize(core: PisellCore, options?: ModuleOptions): Promise<void>;
    /** 获取当前 store 快照 */
    getState(): SalesState;
    /** 获取当前选择日期 */
    getCurrentDay(): dayjs.Dayjs;
    /** 设置当前选择日期，会自动归一到当天 00:00:00 */
    setCurrentDay(currentDay: dayjs.ConfigType): dayjs.Dayjs;
    /** 获取当前预约列表 */
    getReservationList(): Reservation[];
    /** 覆盖设置当前预约列表 */
    setReservationList(reservationList: Reservation[]): Reservation[];
    /** 重置预约列表为空 */
    resetReservationList(): Reservation[];
    cancelOrder(orderIds: Array<number | string>): Promise<any>;
    changeBookingStatus(params: ChangeBookingStatusParams): Promise<any>;
    destroy(): Promise<void>;
    /**
     * 时间轴粒度（分钟）
     * - 默认 15 分钟
     * - 可通过 registerModule 时的 options.otherParams.timelineBucketMinutes 覆盖
     */
    private getTimelineBucketMinutes;
    /**
     * 解析营业日统计窗口：
     * - 当 operating_day_boundary.type === 'start_time'
     *   使用「今天 + boundary.time」到「明天 + boundary.time」
     * - 否则回退自然日（00:00 到次日 00:00）
     */
    private getTimelineRangeByOperatingBoundary;
    /**
     * 统计时间轴每个时间片的预约数量。
     * 算法使用差分数组，复杂度 O(n + s):
     * - n = booking 数量
     * - s = 时间片数量
     */
    getTimelineHighlights(bookingList?: BookingData[], startDateTime?: string, endDateTime?: string): SalesTimelineHighlights;
    /** dayjs 未启用插件时，手动封装 >= 判断 */
    private isSameOrAfter;
    /** dayjs 未启用插件时，手动封装 <= 判断 */
    private isSameOrBefore;
    /**
     * 将 booking 的日期/时间字段统一组装为 dayjs
     * - date + time 都有：按完整时间解析
     * - 只有一个字段：按单字段解析（兼容历史数据）
     * - 都没有：返回 invalid
     */
    private toBookingDateTime;
    /**
     * 预约状态映射（面向 UI 的统一状态）
     * 说明：locked 逻辑后续会补业务规则，这里先保留分支占位。
     */
    private getBookingStatus;
    private getResourceId;
    private getBookingAppointmentStatus;
    private isBookingIncludedInStats;
    private getBookingOrderPaymentStatus;
    private countBookingOrders;
    private countCompletedBookings;
    private groupBookingsByResource;
    private isBookingMatchedResource;
    private sortMatchedBookings;
    /**
     * 资源下 bookings 的返回裁剪策略：
     * 1) 优先返回当前时刻正在进行中的预约（允许并发返回多条）
     * 2) 若无 active，返回已超时且仍占用中的预约（允许并发多条）
     * 3) 若仍无，返回最近一组未来预约（同 start_time 的并发预约全部返回）
     * 4) 最后兜底返回一条（避免资源有历史预约时完全无反馈）
     */
    private pickBookingsForCurrentPoint;
    /**
     * 计算 booking 在 current 时刻的执行进度百分比（0-100）。
     * - startAt/endAt 非法或 totalMinutes <= 0 返回 0
     * - current 早于 startAt 返回 0，晚于 endAt 返回 100
     */
    private calcProgressPercent;
    /**
     * 标准化单条 booking 的分发入口：
     * - 统一过滤 rejected / cancelled（视为没来过）
     * - current === deviceCurrent 走实时分支（信任 appointment_status）
     * - 否则走快照分支（纯时间窗判定，忽略 appointment_status 的 arrived/started/completed 差异）
     */
    private normalizeMatchedBooking;
    private normalizeResourceBookings;
    private buildCompletedBooking;
    /**
     * 实时模式（current === deviceCurrent）：信任 appointment_status
     * - 过滤 new / completed（实时视角下视为非活跃数据）
     * - status 由 getBookingStatus 映射
     * - occupied 且 current > endAt 标记 isTimeout + timeoutTime
     * - reserved 且 current < startAt 标记 not_arrived，否则标记 late
     */
    private buildRealtimeBooking;
    /**
     * 快照模式（current !== deviceCurrent，过去或未来）：忽略 appointment_status
     * 的实时态差异，仅按 booking 时间窗判定，为 current 提供时间点快照视图。
     *
     * - new：视作尚未成为真实预约，过滤
     * - locked：保留 status=locked，不计算 timeout/late/progress
     * - 其他非终态：
     *   - startAt/endAt 非法 → 过滤
     *   - current > endAt → 过滤（已结束，不入池）
     *   - current ∈ [startAt, endAt] → occupied，附带 progressPercent
     *   - current < startAt → reserved + not_arrived，附带 remainingReserveTime
     *
     * 快照模式下 isTimeout 恒为 false，lateTime / timeoutTime 始终置空。
     */
    private buildSnapshotBooking;
    getResourceBookingList(currentTime: string, bookingList?: BookingData[], deviceTime?: string): Promise<SalesResourceBookingItem[]>;
    getResourceBookingItem(params: GetResourceBookingItemParams): Promise<SalesResourceBookingItemWithGroups | null>;
}
export { SalesImpl as Sales };
export default SalesImpl;
