import { ProductsModule } from './modules/products';
import { MenuModule } from './modules/menu';
import { QuotationModule } from './modules/quotation';
import { ScheduleModuleEx } from './modules/schedule';
import { ResourceModule } from './modules/resource';
import { FloorPlanModule } from './modules/floor-plan';
import { PisellCore, ServerModuleConfig, InitializeServerOptions } from '../types';
import type { RouteHandler, HttpMethod, RouteDefinition, Router, ModuleRegistryConfig, RequestSetting } from './types';
import { OrderModule } from './modules/order';
export type { RouteHandler, HttpMethod, RouteDefinition, Router, ModuleRegistryConfig, };
/**
 * Server 类
 * 用于注册和管理服务端模块
 */
declare class Server {
    private core;
    private app;
    private logger;
    products?: ProductsModule;
    menu?: MenuModule;
    quotation?: QuotationModule;
    schedule?: ScheduleModuleEx;
    resource?: ResourceModule;
    order?: OrderModule;
    floor_plan?: FloorPlanModule;
    /** GET 前缀路由（最长前缀优先匹配） */
    private prefixRouterGet;
    router: Router;
    private productQuerySubscribers;
    private orderQuerySubscribers;
    private bookingQuerySubscribers;
    private floorPlanQuerySubscribers;
    private moduleRegistry;
    constructor(core: PisellCore);
    /**
     * 注册路由
     * @param routes 路由定义数组
     */
    private registerRoutes;
    /**
     * 注册前缀路由（仅 GET）。匹配规则：path === prefix 或 path 以 prefix + '/' 开头；最长前缀优先。
     */
    private registerPrefixRoutes;
    /**
     * 注册单个模块并自动注册其路由
     * @param module 模块实例
     * @param options 模块配置
     * @param moduleName 模块名称（用于日志）
     */
    private registerModuleWithRoutes;
    /**
     * 根据模块名称注册单个模块
     * @param moduleConfig 模块配置（可以是字符串或配置对象）
     */
    private registerModuleByName;
    /**
     * 注册指定的服务端模块
     * @param moduleConfigs 要注册的模块配置数组（模块名称或配置对象）
     */
    registerModules(moduleConfigs?: (string | ServerModuleConfig)[]): Promise<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }[]>;
    /**
     * 预加载指定模块的数据
     * @param registeredModules 已注册的模块信息
     */
    preloadModulesData(registeredModules: Array<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }>, options?: InitializeServerOptions): Promise<void>;
    /**
     * 初始化 Server（注册模块并预加载数据）
     * @param moduleConfigs 要注册的模块配置
     * @param autoPreload 是否自动预加载数据
     */
    initialize(moduleConfigs?: (string | ServerModuleConfig)[], autoPreload?: boolean, options?: InitializeServerOptions): Promise<{
        module: any;
        config: ModuleRegistryConfig;
        shouldPreload: boolean;
    }[]>;
    /**
     * 获取 Products 模块实例
     */
    getProducts(): ProductsModule | undefined;
    /**
     * 获取 Menu 模块实例
     */
    getMenu(): MenuModule | undefined;
    /**
     * 获取 Quotation 模块实例
     */
    getQuotation(): QuotationModule | undefined;
    /**
     * 获取 Schedule 模块实例
     */
    getSchedule(): ScheduleModuleEx | undefined;
    /**
     * 获取所有已注册的模块列表
     */
    getRegisteredModules(): string[];
    /**
     * 后台静默刷新商品数据
     * 重新拉取全量 SSE 接口，更新本地数据后触发 onProductsSyncCompleted
     * 不影响当前界面展示，适用于切回前台、定时刷新等场景
     */
    refreshProductsInBackground(): Promise<void>;
    /**
     * 清空所有server模块的IndexedDB缓存
     * @returns Promise<void>
     */
    clearAllIndexDB(): Promise<void>;
    /**
     * 获取所有注册的路由
     */
    getRoutes(): Router;
    /**
     * 根据方法和路径获取路由处理函数
     * @param method HTTP 方法
     * @param path 路径
     */
    getRouteHandler(method: HttpMethod, path: string): RouteHandler | undefined;
    /**
     * 检查路由是否存在
     * @param method HTTP 方法
     * @param path 路径
     */
    hasRoute(method: HttpMethod, path: string): boolean;
    /**
     * 执行路由处理函数
     * @param method HTTP 方法
     * @param path 路径
     * @param params 请求参数
     */
    handleRoute(method: HttpMethod, path: string, params: {
        url: string;
        method: HttpMethod;
        data?: any;
        config?: RequestSetting;
    }): Promise<any>;
    /**
     * 获取所有路由列表（用于调试和文档）
     */
    getAllRoutes(): Array<{
        method: HttpMethod;
        path: string;
    }>;
    /**
     * 注册 Server 层的业务路由
     * 这些路由需要编排多个模块的数据
     * @private
     */
    private registerServerRoutes;
    /**
     * 根据 subscriberId 移除商品查询订阅者
     */
    removeProductQuerySubscriber(subscriberId?: string): void;
    /**
     * 处理商品查询请求
     * 存储订阅者信息，便于数据变更时推送最新结果
     */
    private handleProductQuery;
    /**
     * 取消商品查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeProductQuery;
    /**
     * 处理订单列表查询
     * 存储订阅者信息，本地计算结果；数据变更时通过 callback 推送
     */
    private handleOrderList;
    /**
     * 取消订单列表查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeOrderQuery;
    /**
     * 判断预约查询的 sales_time_between 起始日期是否为今天
     */
    private isBookingQueryForToday;
    /**
     * 非今天的预约查询：通过真实 API 获取数据，再做 flattenOrdersToBookings 拆分
     */
    private fetchBookingListFromAPI;
    /**
     * 处理预约列表查询
     * 今天：注册订阅者 + 本地数据筛选；非今天：清理订阅者 + 走真实 API
     */
    private handleBookingList;
    /**
     * 处理资源列表查询
     * 转发到资源模块去
     */
    private handleResourceList;
    /**
     * 从 url 或路由 path 解析 pathname（不含 query，去掉末尾 /）
     */
    private parseRequestPath;
    /**
     * 解析平面图 GET 路径为查询上下文
     */
    private resolveFloorPlanQueryContext;
    /**
     * GET /shop/schedule/floor-plan* 前缀路由：读本地 store；支持 subscriberId + callback 订阅更新
     */
    private handleFloorPlanGet;
    private computeFloorPlanQueryResult;
    /**
     * 平面图数据变更后向所有 GET 订阅者推送最新结果
     */
    private recomputeAndNotifyFloorPlanQuery;
    /**
     * 取消平面图 GET 订阅（也可走 GET .../unsubscribe + subscriberId）
     */
    removeFloorPlanQuerySubscriber(subscriberId?: string): void;
    /**
     * 取消预约列表查询订阅（HTTP 路由入口）
     */
    private handleUnsubscribeBookingQuery;
    /**
     * 订单列表本地计算（编排 Order 模块）
     * filter 逻辑暂为 mock，仅记录参数
     */
    private computeOrderQueryResult;
    /**
     * 预约列表本地计算（编排 Order 模块）
     * 从订单中展开 bookings，再按条件筛选 + 分页
     */
    private computeBookingQueryResult;
    /**
     * 商品查询的核心计算逻辑（编排 Products、Menu、Schedule 模块）
     * 供 handleProductQuery 首次返回及 pubsub 变更推送复用
     * @param context 查询上下文
     * @param options 可选参数
     * @param options.changedIds 变更的商品 IDs，用于增量更新价格缓存
     */
    private computeProductQueryResult;
    /**
     * 数据变更后，遍历所有订阅者重新计算查询结果并通过 callback 推送
     * 由 ProductsModule 的 onProductsSyncCompleted 事件触发
     * @param options 可选参数
     * @param options.changedIds 变更的商品 IDs，用于增量更新价格缓存
     */
    private recomputeAndNotifyProductQuery;
    /**
     * 订单数据变更后，遍历订阅者重新计算并通过 callback 推送
     */
    private recomputeAndNotifyOrderQuery;
    /**
     * 预约数据变更后，遍历订阅者重新计算并通过 callback 推送
     */
    private recomputeAndNotifyBookingQuery;
    /**
     * 根据餐牌配置过滤商品
     * @param products 所有商品列表
     * @param activeMenuList 生效的餐牌列表
     * @returns 过滤后的商品列表
     * @private
     */
    private filterProductsByMenuConfig;
    /**
     * 记录信息日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logInfo;
    /**
     * 记录警告日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logWarning;
    /**
     * 记录错误日志
     * @param title 日志标题
     * @param metadata 日志元数据
     */
    private logError;
    /**
     * 处理获取日程时间段点的请求
     * 通过餐牌ID列表获取所有相关日程的时间段点
     */
    private handleGetScheduleTimePoints;
}
export default Server;
export * from './modules';
