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

import { NextRequest, NextResponse } from 'next/server';
import { PoolConnection } from 'mysql2/promise';
import dbManager from './db-singleton';

/**
 * 扩展NextRequest类型，添加db属性
 */
export interface RequestWithDB extends NextRequest {
  db: PoolConnection;
  parsedBody?: unknown; // 添加预解析的请求体数据
}

/**
 * 请求处理器类型
 */
export type Handler = (
  req: RequestWithDB,
  params?: Record<string, unknown>
) => Promise<NextResponse>;

/**
 * 系统数据库连接中间件
 * 为API路由提供系统数据库连接
 * 
 * @param handler API处理函数
 * @returns 包装后的处理函数
 */
export const connectSystemDB = (handler: Handler) => {
  return async (req: NextRequest, params?: Record<string, unknown>) => {
    // 等待数据库初始化完成
    const isReady = await dbManager.waitForReady();
    
    if (!isReady) {
      return NextResponse.json(
        { error: '数据库连接尚未初始化，请稍后再试' },
        { status: 503 }
      );
    }
    
    try {
      // 从连接池获取连接
      const connection = await dbManager.getConnection();
      console.log('🟢 MySQL 系统数据库连接已获取');
      
      // 将连接附加到请求对象
      const reqWithDB = Object.assign(req, { db: connection }) as RequestWithDB;
      
      try {
        const response = await handler(reqWithDB, params);
        connection.release(); // 释放回连接池
        console.log('🟢 MySQL 系统数据库连接已释放');
        return response;
      } catch (error) {
        connection.release(); // 确保异常时释放连接
        console.log('🟢 MySQL 系统数据库连接已释放（异常）');
        throw error;
      }
    } catch (error) {
      console.error('🔴 系统数据库连接失败:', error);
      return NextResponse.json(
        { error: '数据库连接错误，请联系管理员' },
        { status: 500 }
      );
    }
  };
}; 