function _define_property(obj, key, value) {
    if (key in obj) {
        Object.defineProperty(obj, key, {
            value: value,
            enumerable: true,
            configurable: true,
            writable: true
        });
    } else {
        obj[key] = value;
    }
    return obj;
}
/**
 * 路由中间件管理器
 * 负责管理路由中间件的注册、执行和生命周期
 */ import { logger } from "../../../utils";
/**
 * 路由中间件管理器
 */ export class RouterMiddlewareManager {
    /**
   * 注册中间件
   * 
   * @param config - 中间件配置
   * @returns 取消注册函数
   */ register(config) {
        // 验证中间件配置
        if (!config.middleware || typeof config.middleware !== 'function') {
            throw new Error('中间件必须是一个函数');
        }
        // 设置默认值
        const middlewareConfig = {
            priority: 100,
            enabled: true,
            ...config
        };
        // 添加到中间件列表
        this.middlewares.push(middlewareConfig);
        // 按优先级排序
        this.middlewares.sort((a, b)=>(a.priority || 100) - (b.priority || 100));
        logger.debug(`路由中间件已注册: ${middlewareConfig.name || 'anonymous'}`);
        // 返回取消注册函数
        return ()=>{
            const index = this.middlewares.indexOf(middlewareConfig);
            if (index > -1) {
                this.middlewares.splice(index, 1);
                logger.debug(`路由中间件已取消注册: ${middlewareConfig.name || 'anonymous'}`);
            }
        };
    }
    /**
   * 批量注册中间件
   * 
   * @param configs - 中间件配置数组
   */ registerBatch(configs) {
        configs.forEach((config)=>this.register(config));
    }
    /**
   * 取消注册中间件
   * 
   * @param name - 中间件名称
   */ unregister(name) {
        const index = this.middlewares.findIndex((m)=>m.name === name);
        if (index > -1) {
            this.middlewares.splice(index, 1);
            logger.debug(`路由中间件已取消注册: ${name}`);
        }
    }
    /**
   * 清空所有中间件
   */ clear() {
        this.middlewares = [];
        logger.debug('所有路由中间件已清空');
    }
    /**
   * 执行中间件链
   * 
   * @param context - 中间件上下文
   * @returns 中间件执行结果
   */ async execute(context) {
        // 过滤启用的中间件
        const enabledMiddlewares = this.middlewares.filter((m)=>{
            if (!m.enabled) {
                return false;
            }
            // 检查条件函数
            if (m.condition && !m.condition(context)) {
                return false;
            }
            return true;
        });
        // 按顺序执行中间件
        for (const middlewareConfig of enabledMiddlewares){
            try {
                const result = await middlewareConfig.middleware(context);
                // 如果中间件返回 false 或包含 allow: false，阻止导航
                if (typeof result === 'object' && result.allow === false) {
                    logger.debug(`路由中间件阻止导航: ${middlewareConfig.name || 'anonymous'}`, result);
                    return typeof result === 'object' ? result : {
                        allow: false,
                        reason: '中间件返回 false'
                    };
                }
                // 如果中间件返回字符串，重定向到该路径
                if (typeof result === 'string') {
                    logger.debug(`路由中间件重定向: ${middlewareConfig.name || 'anonymous'} -> ${result}`);
                    return {
                        allow: false,
                        redirect: result
                    };
                }
            } catch (error) {
                logger.error(`路由中间件执行失败: ${middlewareConfig.name || 'anonymous'}`, error);
                continue;
            }
        }
        // 所有中间件都通过，允许导航
        return {
            allow: true
        };
    }
    /**
   * 获取所有中间件
   * 
   * @returns 中间件配置数组
   */ getAll() {
        return [
            ...this.middlewares
        ];
    }
    /**
   * 获取启用的中间件
   * 
   * @returns 启用的中间件配置数组
   */ getEnabled() {
        return this.middlewares.filter((m)=>m.enabled);
    }
    /**
   * 获取中间件数量
   * 
   * @returns 中间件数量
   */ getCount() {
        return this.middlewares.length;
    }
    constructor(){
        _define_property(this, "middlewares", []);
    }
}
/**
 * 获取路由中间件管理器单例
 */ let middlewareManagerInstance = null;
export function getRouterMiddlewareManager() {
    if (!middlewareManagerInstance) {
        middlewareManagerInstance = new RouterMiddlewareManager();
    }
    return middlewareManagerInstance;
}

//# sourceMappingURL=RouterMiddlewareManager.js.map