// =============================================================================
// 企微IT智能服务台 — 文件上传 API 调用模块
// =============================================================================
// 说明：封装文件上传相关的 HTTP 请求
// 对应后端 API：/api/upload
// =============================================================================

import apiClient from './index'
import type { AxiosResponse } from 'axios'

// --------------------------------------------------------------------------
// TypeScript 类型定义
// --------------------------------------------------------------------------

/** 上传响应数据 */
export interface UploadResponse {
  /** 文件访问URL（前端用于展示/下载） */
  url: string
  /** 原始文件名（显示用） */
  filename: string
  /** 文件大小（字节） */
  file_size: number
  /** 消息类型（image 或 file） */
  msg_type: 'image' | 'file'
  /** 文件扩展名 */
  extension: string
}

// --------------------------------------------------------------------------
// API 函数
// --------------------------------------------------------------------------

/**
 * 上传文件到服务器
 *
 * 处理流程：
 * 1. 前端选择文件（点击上传 / 粘贴图片 / 拖拽文件）
 * 2. 调用此函数将文件上传到后端
 * 3. 后端返回文件URL和元数据
 * 4. 前端调用 sendMessage 将文件URL作为消息发送
 *
 * @param file - 要上传的文件对象（File / Blob）
 * @returns 上传响应数据（包含文件URL、文件名等）
 */
export async function uploadFile(file: File | Blob): Promise<UploadResponse> {
  // 构建 FormData（multipart/form-data 格式，后端用 UploadFile 接收）
  const formData = new FormData()

  if (file instanceof File) {
    // File 对象自带 name 属性，直接 append
    formData.append('file', file)
  } else {
    // Blob 对象没有 name 属性，必须手动指定文件名
    // 不指定文件名时，浏览器默认用 "blob" 作为文件名，后端无法识别扩展名
    const fileName = `paste-image-${Date.now()}.png`
    formData.append('file', file, fileName)
  }

  const response: AxiosResponse = await apiClient.post('/upload', formData, {
    // 必须显式删除 Content-Type，让浏览器自动生成带 boundary 的 multipart/form-data
    // 原因：apiClient 实例默认设置了 'Content-Type': 'application/json'
    // 如果不覆盖，Axios 会保留 application/json，后端无法解析 FormData 中的 file 字段
    headers: {
      'Content-Type': undefined,
    },
    timeout: 60000,
  })
  return response.data.data
}
