/**
 * 团队数据库连接工具
 * 作者: 阿瑞
 * 功能: 提供团队数据库连接中间件，为API路由提供团队数据库连接
 * 版本: 3.2
 */

import { NextRequest, NextResponse } from 'next/server';
import { RequestWithDB, Handler } from './connect-system';
import teamDbManager, { TeamDbInfo } from './teamdb-singleton';

/**
 * 从系统数据库中获取团队数据库连接信息
 * @param teamCode 团队代码
 * @returns 返回Promise，解析为团队数据库连接信息
 */
const getTeamDBInfoFromSystem = async (teamCode: string): Promise<TeamDbInfo | null> => {
  try {
    console.log(`开始查询团队[${teamCode}]数据库连接信息`);
    // 直接使用teamDbManager的方法获取团队数据库信息
    const teamDbInfo = await teamDbManager.getTeamDBInfoByCode(teamCode);
    
    if (!teamDbInfo) {
      console.error(`未找到团队[${teamCode}]或团队已被禁用`);
      return null;
    }
    
    console.log(`获取到团队[${teamCode}]数据库连接信息: ${teamDbInfo.dbHost}/${teamDbInfo.dbName}`);
    return teamDbInfo;
  } catch (error) {
    console.error('获取团队数据库连接信息失败:', error);
    return null;
  }
};

/**
 * 从请求中获取团队数据库连接信息
 * @param req NextRequest对象
 * @returns 团队数据库连接信息的Promise
 */
const getTeamDBInfoFromRequest = async (req: NextRequest): Promise<TeamDbInfo | null> => {
  // 从请求中获取团队代码（可以从多个位置获取）
  const teamCode = req.headers.get('x-team-id') || 
                  req.nextUrl.searchParams.get('teamId');
  
  if (!teamCode) {
    // 尝试从URL路径中提取 /api/team/[teamCode]/xxx
    const pathParts = req.nextUrl.pathname.split('/');
    const pathIndex = pathParts.findIndex(part => part === 'team');
    
    if (pathIndex !== -1 && pathIndex + 1 < pathParts.length) {
      const pathTeamCode = pathParts[pathIndex + 1];
      
      if (pathTeamCode) {
        console.log(`从URL路径中提取到团队代码: ${pathTeamCode}`);
        return getTeamDBInfoFromSystem(pathTeamCode);
      }
    }
    
    console.error('请求中未找到团队标识');
    return null;
  }
  
  // 从系统数据库中获取团队信息
  console.log(`从请求中获取到团队代码: ${teamCode}`);
  return getTeamDBInfoFromSystem(teamCode);
};

/**
 * 团队数据库连接中间件
 * 从请求中自动提取团队信息并连接对应的数据库
 * 
 * @param handler API处理函数
 * @returns 包装后的处理函数
 */
export const connectTeamDB = (handler: Handler) => {
  return async (req: NextRequest, params?: Record<string, unknown>) => {
    // 获取团队数据库连接信息
    const teamDBInfo = await getTeamDBInfoFromRequest(req);
    
    if (!teamDBInfo) {
      return NextResponse.json(
        { error: '无法获取团队信息，请确保请求包含有效的团队标识' },
        { status: 400 }
      );
    }
    
    try {
      // 使用团队数据库管理器获取连接池
      const teamPool = teamDbManager.getTeamDbPool(teamDBInfo);
      
      // 从连接池获取连接
      const connection = await teamPool.getConnection();
      console.log(`🟢 MySQL 团队数据库连接已获取: ${teamDBInfo.dbHost}/${teamDBInfo.dbName}`);
      
      // 检查是否有预先解析的请求体数据
      const bodyDataHeader = req.headers.get('x-request-body');
      let parsedBody = undefined;
      
      if (bodyDataHeader) {
        try {
          parsedBody = JSON.parse(bodyDataHeader);
          console.log('使用预先解析的请求体数据');
        } catch (e) {
          console.warn('预先解析的请求体数据解析失败:', e);
        }
      }
      
      // 将连接附加到请求对象，同时添加解析好的body数据（如果有）
      const reqWithDB = Object.assign(req, { 
        db: connection,
        parsedBody // 添加预解析的body数据
      }) as RequestWithDB & { parsedBody?: unknown };
      
      try {
        const response = await handler(reqWithDB, params);
        connection.release(); // 释放回连接池
        console.log(`🟢 MySQL 团队数据库连接已释放: ${teamDBInfo.dbHost}/${teamDBInfo.dbName}`);
        return response;
      } catch (error) {
        connection.release(); // 确保异常时释放连接
        console.log(`🟢 MySQL 团队数据库连接已释放（异常）: ${teamDBInfo.dbHost}/${teamDBInfo.dbName}`);
        throw error;
      }
    } catch (error) {
      console.error(`🔴 团队数据库连接失败:`, error);
      return NextResponse.json(
        { error: '数据库连接错误，请联系管理员' },
        { status: 500 }
      );
    }
  };
}; 