import axios from 'axios';
import qs from 'query-string';
import { Notification } from '@arco-design/web-vue';
import dayjs from 'dayjs';

/**
 * 下载
 *
 * @param url URL
 * @param params 查询条件
 * @param fileName 文件名
 */
export default function download(
  url: string,
  params: any,
  fileName: string | undefined,
) {
  return axios
    .get(url, {
      params,
      paramsSerializer: (obj) => {
        return qs.stringify(obj);
      },
      responseType: 'blob',
    })
    .then(async (res) => {
      // 获取文件名
      if (!fileName) {
        const contentDisposition = res.headers['content-disposition'];
        const pattern = new RegExp('filename=([^;]+\\.[^\\.;]+);*');
        const result = pattern.exec(contentDisposition) || '';
        // 对名字进行解码
        fileName = window.decodeURI(result[1]);
      } else {
        fileName = `${fileName}_${dayjs().format('YYYYMMDDHHmmss')}`;
      }

      // 创建下载的链接
      const blob = new Blob([res.data], {
        type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8',
      });
      const downloadElement = document.createElement('a');
      const href = window.URL.createObjectURL(blob);
      downloadElement.style.display = 'none';
      downloadElement.href = href;
      // 下载后文件名
      downloadElement.download = fileName;
      document.body.appendChild(downloadElement);
      // 点击下载
      downloadElement.click();
      // 下载完成，移除元素
      document.body.removeChild(downloadElement);
      // 释放掉 blob 对象
      window.URL.revokeObjectURL(href);
    })
    .catch(() => {
      Notification.warning({
        title: '警告',
        content:
          "由于部分模拟数据需要，前端默认启用了 Mock.js，而 Mock.js 会将 responseType 设置为 ''，这不仅会导致关键判断出错，也会导致导出的文件无法打开，实际开发时自行关闭 Mock 即可。",
        duration: 10000,
        closable: true,
      });
    });
}
