/**
 * @作者: 阿瑞
 * @功能: 测试用上传图片API，支持指定文件夹
 * @版本: 1.0.0
 */

import { NextRequest, NextResponse } from 'next/server';
import { writeFile, mkdir, access } from 'fs/promises';
import { constants } from 'fs';
import path from 'path';
import { existsSync } from 'fs';
import { nanoid } from 'nanoid';

// 设置基础上传目录
const baseUploadsDir = path.join(process.cwd(), 'uploads');

// 文件大小限制 (10MB)
const MAX_FILE_SIZE = 10 * 1024 * 1024;

// 确保目录存在
async function ensureDir(dirPath: string) {
  if (!existsSync(dirPath)) {
    await mkdir(dirPath, { recursive: true });
  }
}

// 检查文件是否存在
async function fileExists(filePath: string) {
  try {
    await access(filePath, constants.F_OK);
    return true;
  } catch {
    return false;
  }
}

// 处理可能的文件重名
async function generateUniqueFileName(dirPath: string, originalName: string): Promise<string> {
  // 分离文件名和扩展名
  const ext = path.extname(originalName);
  const nameWithoutExt = path.basename(originalName, ext);
  
  // 检查文件是否已存在
  const filePath = path.join(dirPath, originalName);
  if (!(await fileExists(filePath))) {
    return originalName; // 文件不存在，可以直接使用原名
  }
  
  // 文件存在，生成唯一的文件名
  const uniqueName = `${nameWithoutExt}_${nanoid(6)}${ext}`;
  return generateUniqueFileName(dirPath, uniqueName); // 递归检查新名称是否可用
}

// 处理图片上传请求
export async function POST(request: NextRequest) {
  try {
    await ensureDir(baseUploadsDir);
    
    // 使用FormData API处理上传文件
    const formData = await request.formData();
    const file = formData.get('file') as File | null;
    const folder = formData.get('folder') as string | null;
    
    // 确定上传目录
    let uploadsDir = baseUploadsDir;
    if (folder) {
      // 过滤文件夹名中的非法字符，防止目录遍历攻击
      const safeFolderName = folder.replace(/[^\w-]/g, '_');
      uploadsDir = path.join(baseUploadsDir, safeFolderName);
      await ensureDir(uploadsDir);
    }
    
    if (!file) {
      return NextResponse.json(
        { 
          error: '没有提供文件',
          code: 'NO_FILE_PROVIDED',
          details: '请确保在请求中包含一个有效的文件字段'
        },
        { status: 400 }
      );
    }
    
    // 验证文件类型
    const validTypes = ['image/jpeg', 'image/png', 'image/gif', 'image/webp'];
    if (!validTypes.includes(file.type)) {
      return NextResponse.json(
        { 
          error: '不支持的文件类型',
          code: 'INVALID_FILE_TYPE',
          details: '请上传JPG、PNG、GIF或WEBP格式的图片',
          supportedTypes: validTypes
        },
        { status: 400 }
      );
    }
    
    // 检查文件大小
    if (file.size > MAX_FILE_SIZE) {
      return NextResponse.json(
        { 
          error: '文件大小超出限制',
          code: 'FILE_TOO_LARGE',
          details: `文件大小超出限制，最大允许${MAX_FILE_SIZE / (1024 * 1024)}MB`,
          maxSize: MAX_FILE_SIZE,
          actualSize: file.size
        },
        { status: 400 }
      );
    }
    
    // 处理文件名（避免重名）
    const originalFileName = file.name;
    const fileName = await generateUniqueFileName(uploadsDir, originalFileName);
    const filePath = path.join(uploadsDir, fileName);
    
    // 将文件内容转换为Buffer
    const fileBuffer = Buffer.from(await file.arrayBuffer());
    
    // 写入文件到服务器
    await writeFile(filePath, fileBuffer);
    
    // 构建相对于基础上传目录的URL路径
    let urlPath = `/api/tools/images/${fileName}`;
    if (folder) {
      const safeFolderName = folder.replace(/[^\w-]/g, '_');
      urlPath = `/api/tools/images/${safeFolderName}/${fileName}`;
    }
    
    // 返回成功响应
    return NextResponse.json({
      message: '图片上传成功',
      fileName,
      folder: folder || null,
      originalFileName: originalFileName !== fileName ? originalFileName : undefined,
      url: urlPath,
      size: file.size,
      type: file.type
    });
    
  } catch (error) {
    console.error('上传图片时出错:', error);
    
    // 提供更详细的错误信息
    const errorMessage = error instanceof Error ? error.message : '未知错误';
    
    return NextResponse.json(
      { 
        error: '上传图片时出错',
        code: 'UPLOAD_FAILED',
        details: errorMessage,
        timestamp: new Date().toISOString()
      },
      { status: 500 }
    );
  }
} 