import { createServerMiddleware } from './server-utils';
import type { H3Event } from 'h3';

/**
 * 泳道管理服务器中间件
 *
 * 这个中间件负责处理跨泳道请求的路由和转发。
 * 当请求包含目标泳道头信息且目标泳道与当前泳道不同时，
 * 中间件会查询 Nacos 获取目标泳道的健康实例，并将请求转发到目标实例。
 *
 * 中间件通过 createServerMiddleware 函数创建，该函数定义在 server-utils.ts 中。
 */

// 创建中间件处理函数
const middleware = createServerMiddleware();

// 导出中间件处理函数
export default async (event: H3Event) => {
  // 检查请求是否已经被处理过，避免重复处理
  if (event.context._laneManagerHandled) {
    return;
  }

  // 记录中间件被调用
  console.log(`[multi-lane-manager:server-middleware] 中间件被调用，路径: ${event.path}`);

  // 特别记录 API 请求
  if (event.path.startsWith('/api/')) {
    console.log(`[multi-lane-manager:server-middleware] 处理 API 请求: ${event.path}, 方法: ${event.node.req.method}`);
  }

  try {
    // 调用实际的中间件处理函数
    return await middleware(event);
  } catch (error) {
    console.error(`[multi-lane-manager:server-middleware] 处理请求时出错: ${error instanceof Error ? error.message : String(error)}`);

    // 如果响应头尚未发送，返回错误响应
    if (!event.node.res.headersSent) {
      event.node.res.statusCode = 500;
      event.node.res.setHeader('Content-Type', 'text/plain');
      event.node.res.end(`处理请求时出错: ${error instanceof Error ? error.message : '未知错误'}`);
    }

    // 标记请求已处理
    event.context._laneManagerHandled = true;
  }
};
