import { defineNuxtModule, createResolver, addServerHandler } from "@nuxt/kit";

/**
 * 多泳道管理模块
 *
 * 这个模块提供了多泳道管理功能，包括：
 * 1. 服务注册与发现：将服务实例注册到 Nacos，并从 Nacos 获取目标泳道的服务实例
 * 2. 跨泳道请求转发：将请求转发到目标泳道的服务实例
 * 3. 健康检查：提供健康检查接口
 */
export default defineNuxtModule({
  meta: {
    name: "multi-lane-manager",
    configKey: "multiLaneManager", // 统一使用与类型定义相同的配置键
    compatibility: {
      nuxt: "^3.0.0", // 兼容 Nuxt 3.0.0 及以上版本
    },
  },
  /**
   * 模块设置函数
   * 负责注册 Nitro 插件和服务器中间件
   *
   * @param _options 模块配置选项
   * @param nuxt Nuxt 实例
   */
  setup(_options, nuxt) {
    // 创建简单的日志记录器
    const logger = {
      info: (msg: string) => console.log(`[multi-lane-manager:module][INFO] 🔵 ${msg}`),
      warn: (msg: string) => console.warn(`[multi-lane-manager:module][WARN] 🟠 ${msg}`),
      error: (msg: string) => console.error(`[multi-lane-manager:module][ERROR] 🔴 ${msg}`),
    };

    logger.info("正在设置 multi-lane-manager 模块...");

    // 创建路径解析器
    const { resolve } = createResolver(import.meta.url);

    // 添加 Nitro 插件
    try {
      logger.info("正在添加用于服务注册的 Nitro 插件...");
      nuxt.hook('nitro:config', (nitroConfig) => {
        // 确保 plugins 数组存在
        nitroConfig.plugins = nitroConfig.plugins || [];

        // 添加我们的 Nitro 插件到数组的最前面，确保它最早执行
        nitroConfig.plugins.unshift(resolve('./runtime/nitro-plugin'));

        logger.info("Nitro 插件添加成功 (已设置为最早执行) ✅");
      });
    } catch (error) {
      logger.error(`添加 Nitro 插件失败: ${error}`);
    }

    // 添加服务器中间件
    try {
      logger.info("正在添加服务器中间件...");

      // 添加一个全局中间件，确保它在所有其他中间件之前执行
      addServerHandler({
        handler: resolve('./runtime/server-middleware.mjs'),
        middleware: true,
        route: '/**', // 匹配所有路径
        order: -100, // 负数表示更高的优先级，确保最先执行
      });

      // 为了确保能拦截静态资源，再添加一个特定的处理程序用于 /_nuxt/ 路径
      addServerHandler({
        handler: resolve('./runtime/server-middleware.mjs'),
        route: '/_nuxt/**', // 专门匹配 /_nuxt/ 路径下的所有请求
        order: -100, // 负数表示更高的优先级，确保最先执行
      });

      // 为了确保能拦截 API 请求，添加一个特定的处理程序用于 /api/ 路径
      addServerHandler({
        handler: resolve('./runtime/server-middleware.mjs'),
        route: '/api/**', // 专门匹配 /api/ 路径下的所有请求
        middleware: true, // 确保它作为中间件执行
        order: -100, // 负数表示更高的优先级，确保最先执行
      });

      logger.info("服务器中间件添加成功，设置为最高优先级 ✅");
    } catch (error) {
      logger.error(`添加服务器中间件失败: ${error}`);
    }

    logger.info("Multi-lane-manager 模块设置完成 ✅");
  },
});
