import axios from 'axios'
import {
  getToken
} from '@/utils/auth'
import { Message } from 'element-ui'

var uploadUrl = process.env.VUE_APP_BASE_API + "/sysFiles/upload"
var uploadV1Url = process.env.VUE_APP_BASE_API + "/sysFiles/v1/upload"
var importZipUrl = process.env.VUE_APP_BASE_API + "/bizImport/importZip"
/**
 * 封装上传文件的post方法
 * @param data
 * @returns {Promise}
 */
export function uploadFile(data) {
  return new Promise((resolve, reject) => {
    axios.post(uploadUrl, data, {
      headers: {
        'Content-Type': 'multipart/form-data;boundary = ' + new Date().getTime(),
        'authorization': getToken(),
      }
    }).then(response => {
      resolve(response.data)
    }).catch(error => {
      reject(error)
    })
  })
}


/**
 * 封装上传文件方法 支持自定义Formdata 的key
 * @param data
 * @returns {Promise}
 */
export function uploadV1(data) {
  return new Promise((resolve, reject) => {
    axios.post(uploadV1Url, data, {
      headers: {
        'Content-Type': 'multipart/form-data;boundary = ' + new Date().getTime(),
        'authorization': getToken(),
      }
    }).then(response => {
      resolve(response.data)
    }).catch(error => {
      reject(error)
    })
  })
}

/**
 * 批量上传文件 
 * @param {String} importZipUrl   上传地址
 * @param {FormData} data   * 参数1 type:导入数据类别(biz_cultural_relic、biz_exhibition二选一) 参数2 zipFile:zip压缩文件
 * @param {Function} callback  用于获取上传进度
 * @param {Function} cancelCallBack  用于取消上传
 * @returns {Promise}
 */
let CancelToken = axios.CancelToken;
export function importZip(importZipUrl, data, callback, cancelCallBack) {
  return new Promise((resolve, reject) => {
    axios.post(importZipUrl, data, {
      headers: {
        'Content-Type': 'multipart/form-data;boundary = ' + new Date().getTime(),
        'authorization': getToken(),
      },
      onUploadProgress(progressEvent) {
        if (progressEvent.lengthComputable) {
          callback(progressEvent);
        }
      },
      cancelToken: new CancelToken(function executor(c) {
        cancelCallBack(c)
      })
    }).then(response => {
      resolve(response)
    }).catch(error => {
      reject(error)
    })
  })
}


/**
 * 下载文件 
 * @param href 下载地址
 * @param dowmloadName 下载文件用户看到的名称
 */
export function downloadFile(href, dowmloadName) {
  let a = document.createElement("a");
  a.href = href;
  a.download = dowmloadName;
  a.style.display = "none";
  document.body.appendChild(a);
  a.click();
  a.remove();
}

/**
 * 预览文件 
 * @param href 预览地址
 * @param previewName 预览文件用户看到的名称
 */
export function previewFile(href, previewName) {
  let a = document.createElement("a");
  a.href = href;
  a.target = '_blank'
  a.download = previewName;
  a.style.display = "none";
  document.body.appendChild(a);
  a.click();
  a.remove();
}


/**
 * 处理返回的二进制流并触发为下载文件
 * @param {*} response 下载返回的二进制流
 * @param {*} fileName  希望展示的文件名称
 * @param {*} suffix 希望下载展示的文件后缀
 */
export function triggrtUrl(response, fileName, suffix) {
  const blob = new Blob([response.data])
  const link = document.createElement('a')
  link.href = URL.createObjectURL(blob)
  if (suffix) {
    link.download = fileName + '.' + suffix
  } else {
    link.download = fileName
  }
  link.click()
  URL.revokeObjectURL(link.href)
}

/**
 * 下载文件 
 * @param url 下载地址
 * @param fileName 下载文件用户看到的名称
 * @param typeSuffix 文件后缀
 */
export function downloadBlob({ url, method = 'get', fileName, suffix, data }) {
  return new Promise((resolve, reject) => {
    const startMsg = Message.warning('正在下载...')
    const options = {
      url,
      method,
      responseType: 'blob',
      headers: {
        'authorization': getToken()
      }
    }
    if (data) {
      options.data = data
    }
    axios(options).
      then(response => {
        startMsg.close()
        Message.success('下载成功！')
        triggrtUrl(response, fileName, suffix)
        resolve(response)
      }).catch(err => {
        startMsg.close()
        console.error(err);
        Message.error('下载失败：' + err)
        reject(err)
      })
  })
};


// 因为之前的全部都是单独引入，为了不改变以前的代码因此单独用file导出，后期方便$file.uploadFile进行使用
export const file = {
  uploadFile,
  uploadV1,
  importZip,
  downloadFile,
  previewFile,
  downloadBlob,
  triggrtUrl
}