// =============================================================================
// 企微IT智能服务台 — H5用户端文件上传 API
// =============================================================================
// 说明：封装文件/图片上传接口
//   1. 上传文件到后端 /api/upload（multipart/form-data）
//   2. 返回文件 URL、文件名、文件大小等信息
// =============================================================================

import apiClient from '@/api'

/** 上传响应数据 */
export interface UploadResponse {
  /** 文件访问 URL（相对路径，如 /media/2026/06/10/xxx.png） */
  url: string
  /** 服务器存储的文件名 */
  filename: string
  /** 文件大小（字节） */
  file_size: number
  /** 消息类型（image 或 file，根据扩展名判断） */
  msg_type: 'image' | 'file'
}

/**
 * 上传文件到服务器
 *
 * 做什么：将文件/图片上传到后端 /api/upload 端点
 * 流程：
 *   1. 创建 FormData，将文件添加到 file 字段
 *   2. 如果传入的是 Blob（如粘贴的图片），自动生成文件名
 *   3. 发送 multipart/form-data 请求
 *   4. 返回上传结果（URL + 文件信息）
 *
 * @param file - 要上传的文件（File 或 Blob 对象）
 * @param blobNamePrefix - Blob 文件名前缀（默认 'paste'，截图场景传 'screenshot'）
 * @returns 上传响应（含文件 URL、文件名等）
 */
export async function uploadFile(file: File | Blob, blobNamePrefix: string = 'paste'): Promise<UploadResponse> {
  // 构建 FormData
  const formData = new FormData()

  // 如果是 Blob 而非 File，需要生成文件名（File 自带 name 属性）
  if (file instanceof Blob && !(file instanceof File)) {
    // 粘贴的图片默认为 PNG 格式，使用传入的前缀区分来源
    const fileName = `${blobNamePrefix}_${Date.now()}.png`
    formData.append('file', file, fileName)
  } else {
    formData.append('file', file as File)
  }

  // 发送上传请求（60 秒超时，大文件上传可能较慢）
  // 注意：必须显式删除 Content-Type，让浏览器自动生成带 boundary 的 multipart/form-data
  // 原因：apiClient 实例默认设置了 'Content-Type': 'application/json'
  // 如果不覆盖，Axios 会保留 application/json，后端无法解析 FormData 中的 file 字段
  const response: any = await apiClient.post('/upload', formData, {
    headers: {
      'Content-Type': undefined,
    },
    timeout: 60000,
  })

  // 响应拦截器已确保 code === 0
  // response = {code:0, data: {url:"...",...}, message:"success"}（拦截器返回值）
  // response.data = 业务数据 {url:"...", filename:"...", ...}
  return response.data as UploadResponse
}
