import axios from 'axios'
import { Loading, Message } from 'element-ui'
import { getToken } from '@/utils/auth'
import { blobValidate } from '@/utils/bonus'
import { saveAs } from 'file-saver'

// 下载blob文件
export const downloadFile = ({ fileData, fileType, fileName }) => {
  const blob = new Blob([fileData], {
    type: fileType
  })
  const link = document.createElement('a')
  link.href = URL.createObjectURL(blob)
  link.download = fileName
  link.style.display = 'none'
  document.body.appendChild(link)
  link.click()
  URL.revokeObjectURL(link.href)
  document.body.removeChild(link)
}

// 通用a链接下载
export const downloadFileByUrl = (url) => {
  const link = document.createElement('a')
  link.href = url
  link.setAttribute('download', '')
  link.style.display = 'none'
  document.body.appendChild(link)
  link.click()
  URL.revokeObjectURL(link.href)
  document.body.removeChild(link)
}

/**
 * 通用文件下载方法（带加载提示）
 * @param {string} path - 下载路径
 * @param {string} defaultFileName - 默认文件名（可选，如果响应头没有文件名则使用此名称）
 * @param {string} loadingText - 加载提示文本（可选，默认为'正在下载文件，请稍候...'）
 * @returns {Promise} - 返回 Promise
 */
export const downloadFileWithLoading = (path, defaultFileName = '文件.xlsx', loadingText = '正在下载文件，请稍候...') => {
  const baseURL = process.env.VUE_APP_BASE_API
  const url = path.startsWith('http') ? path : `${baseURL}/${path}`

  // 显示下载中提示（优化样式）
  const downloadLoadingInstance = Loading.service({
    lock: true, // 锁定屏幕，防止用户操作
    text: loadingText,
    spinner: 'el-icon-loading',
    background: 'rgba(0, 0, 0, 0.1)', // 稍微降低透明度，更柔和
    customClass: 'download-loading-mask' // 自定义样式类
  })

  return axios({
    method: 'get',
    url: url,
    responseType: 'blob',
    headers: {
      'Authorization': 'Bearer ' + getToken(),
      'encryptResponse':false
    }
  }).then((res) => {
    console.log('res',res)
    // 验证是否为blob格式
    const isBlob = blobValidate(res.data)
    if (isBlob) {
      // 从响应头获取文件名，如果没有则使用默认名称
      const fileName = res.headers['download-filename']
        ? decodeURIComponent(res.headers['download-filename'])
        : defaultFileName

      // 创建blob并下载
      const blob = new Blob([res.data], {
        type: res.data.type || 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
      })
      saveAs(blob, fileName)
      Message.success('文件下载成功')
      return Promise.resolve(fileName)
    } else {
      // 如果不是blob，尝试解析错误信息
      return printErrMsg(res.data)
    }
  }).catch((error) => {
    console.error('文件下载失败:', error)
    Message.error('文件下载失败，请稍后重试')
    return Promise.reject(error)
  }).finally(() => {
    // 关闭加载提示
    if (downloadLoadingInstance) {
      downloadLoadingInstance.close()
    }
  })
}

/**
 * 打印错误信息
 * @param {Blob} data - 错误响应的blob数据
 */
async function printErrMsg(data) {
  try {
    const resText = await data.text()
    const rspObj = JSON.parse(resText)
    Message.error(rspObj.msg || '下载失败，请稍后重试')
    return Promise.reject(new Error(rspObj.msg || '下载失败'))
  } catch (e) {
    Message.error('下载失败，请稍后重试')
    return Promise.reject(e)
  }
}
