import type { Request, Response, NextFunction } from "express";

/**
 * 上下文中间件（对齐 02-architecture-design.md §1.1 Context Middleware）。
 *
 * 职责：在请求到达 GraphQL Yoga 之前，将 x-user-id / x-user-roles / x-request-id
 * 头解析后挂载到 req.parentSession 上下文（供后续 GlobalErrorFilter 使用）。
 *
 * 注意：
 * - Yoga 的 context 由 yoga.ts 的 context() 函数独立构建（buildSession），
 *   本中间件仅作为前置日志 / 错误兜底使用。
 * - 缺失 x-user-id 时 Yoga 的 buildSession 会抛 UnauthorizedError，
 *   本中间件提前打日志便于排查。
 *
 * U4 仲裁：BFF 仅校验 x-user-id 存在，不做 @RequirePermission 权限决策。
 */
export function contextMiddleware(
  req: Request,
  _res: Response,
  next: NextFunction,
): void {
  const userId = req.headers["x-user-id"];
  const requestId = req.headers["x-request-id"];

  // 提前打日志（便于排查缺失 header 的情况）
  if (!userId) {
    // Yoga 的 buildSession 会抛 401，此处仅记录
    console.warn(
      `[parent-bff] Missing x-user-id header on ${req.method} ${req.url}`,
    );
  }

  if (!requestId) {
    // Gateway 必须注入 x-request-id，缺失时打日志但不阻塞
    console.warn(
      `[parent-bff] Missing x-request-id header on ${req.method} ${req.url}`,
    );
  }

  next();
}
