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, SalesTimelineHighlights } from './types';
import type { BookingData } from '../../server/modules/order/types';
export * from './types';
/**
 * Sales 解决方案基础骨架
 *
 * 当前阶段仅提供：
 * - solution 目录结构
 * - 标准入口导出
 * - 基础生命周期占位
 *
 * 不提前实现 store 编排、初始化流程细节、状态计算逻辑。
 */
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;
    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[];
    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;
    /**
     * 资源下 bookings 的返回裁剪策略：
     * 1) 优先返回当前时刻正在进行中的预约（允许并发返回多条）
     * 2) 若无 active，返回已超时且仍占用中的预约（允许并发多条）
     * 3) 若仍无，返回最近一组未来预约（同 start_time 的并发预约全部返回）
     * 4) 最后兜底返回一条（避免资源有历史预约时完全无反馈）
     */
    private pickBookingsForCurrentPoint;
    /**
     * 标准化单条 booking：
     * - 过滤终态（rejected/cancelled/completed）
     * - 注入 status / isTimeout / reserved_status
     */
    private normalizeMatchedBooking;
    getResourceBookingList(currentTime: string, bookingList?: BookingData[]): Promise<SalesResourceBookingItem[]>;
}
export { SalesImpl as Sales };
export default SalesImpl;
