import axios from 'axios'
/**
 * 文件流下载封装 (支持 POST 请求)
 * @param {string} url - 下载地址
 * @param {Object} options - 配置选项
 * @param {'GET'|'POST'} [options.method='GET'] - 请求方法
 * @param {Object} [options.params] - URL 参数 (GET 使用)
 * @param {Object} [options.data] - 请求体数据 (POST 使用)
 * @param {string} [options.filename] - 自定义文件名
 * @param {Object} [options.headers] - 自定义请求头
 * @param {number} [options.timeout=30000] - 超时时间(毫秒)
 * @param {Function} [options.onProgress] - 下载进度回调
 */
export const downloadFile = async (url, options = {}) => {
  const {
    method = 'GET',
    params = {},
    data = {},
    filename = '',
    headers = {},
    timeout = 30000,
    onProgress
  } = options

  try {
    // 创建取消令牌
    const cancelToken = axios.CancelToken.source()

    // 请求配置
    const config = {
      url,
      method,
      responseType: 'blob',
      cancelToken: cancelToken.token,
      timeout,
      headers: {
        // 默认 headers
        'Cache-Control': 'no-cache',
        Pragma: 'no-cache',
        ...headers // 合并自定义 headers
      },
      onDownloadProgress: (progressEvent) => {
        if (onProgress && typeof onProgress === 'function') {
          const percent = Math.round((progressEvent.loaded * 100) / (progressEvent.total || 1))
          onProgress(percent, progressEvent)
        }
      }
    }

    // 根据请求方法添加参数
    if (method.toUpperCase() === 'GET') {
      config.params = params
    } else {
      config.data = data
    }

    const response = await axios(config)

    // 获取文件名
    const detectedFilename = getFilenameFromHeaders(response.headers, filename)

    // 创建下载链接
    const blob = new Blob([response.data])
    const downloadUrl = window.URL.createObjectURL(blob)
    const link = document.createElement('a')

    link.href = downloadUrl
    link.download = detectedFilename
    link.style.display = 'none'
    document.body.appendChild(link)
    link.click()

    // 清理资源
    window.URL.revokeObjectURL(downloadUrl)
    document.body.removeChild(link)

    return { success: true, filename: detectedFilename }
  } catch (error) {
    // 取消请求不报错
    if (axios.isCancel(error)) {
      console.log('下载已取消')
      return { success: false, error: '下载已取消' }
    }

    let errorMessage = '文件下载失败'

    // 尝试解析错误响应
    if (error.response?.data instanceof Blob) {
      try {
        const errorText = await error.response.data.text()
        const errorJson = JSON.parse(errorText)
        errorMessage = errorJson.message || errorJson.error || errorMessage
      } catch {
        // 无法解析的错误响应
        errorMessage = `服务器错误: ${error.response.status}`
      }
    } else if (error.message) {
      errorMessage = error.message
    }

    console.error('下载错误:', errorMessage)
    return { success: false, error: errorMessage }
  }
}

/**
 * 从响应头解析文件名
 */
const getFilenameFromHeaders = (headers, defaultName) => {
  // 优先使用传入的文件名
  if (defaultName) return defaultName

  const disposition = headers['content-disposition'] || ''

  // 尝试匹配标准文件名
  const filenameMatch = disposition.match(/filename="?([^";]+)"?/i)
  if (filenameMatch && filenameMatch[1]) {
    return decodeURIComponent(filenameMatch[1])
  }

  // 尝试匹配 RFC 5987 编码文件名 (带*)
  const rfc5987Match = disposition.match(/filename\*=UTF-8''([^;]+)/i)
  if (rfc5987Match && rfc5987Match[1]) {
    return decodeURIComponent(rfc5987Match[1])
  }

  // 默认文件名
  const ext = headers['content-type']?.split('/')?.[1] || 'bin'
  return `download_${Date.now()}.${ext}`
}

/**
 * 取消所有进行中的下载 (可选)
 */
let activeDownloads = []

export const cancelDownloads = () => {
  activeDownloads.forEach((cancel) => cancel())
  activeDownloads = []
}
