import axios from "axios";
import { getToken } from "@/utils/auth";
import { Loading, Message } from "element-ui";

/*
 * @params {string} url 请求拼接地址
 * @params {object} info 请求参数params或data
 */

let loading;
export async function download(url, method = "get", info, filename) {
  loading = Loading.service({
    lock: true,
    background: "rgba(0,0,0,0.4)",
    text: "文件正在生成中...",
  });

  let options = {
    baseURL: process.env.VUE_APP_BASE_API,
    url,
    method,
    responseType: "blob",
    timeout: 10000,
    headers: {
      Accept: "application/json",
      "Content-Type": "application/json; charset=utf-8",
      withCredentials: true,
      Authorization: "Bearer " + getToken(),
    },
  };
  if (method === "get") {
    Object.defineProperty(options, "params", {
      value: info,
      enumerable: true,
      writable: false,
    });
  }
  if (method === "post") {
    Object.defineProperty(options, "data", {
      value: info,
      enumerable: true,
      writable: false,
    });
  }

  try {
    const response = await axios.request(options);

    loading.close();

    // 提取文件名
    if (!filename) {
      filename =
        response.headers["content-disposition"]?.match(/filename=(.*)/)[1] ||
        "";
    }

    // 将二进制流转为blob
    const blob = new Blob([response.data], {
      type: "application/octet-stream",
    });
    if (typeof window.navigator.msSaveBlob !== "undefined") {
      // 兼容IE，window.navigator.msSaveBlob：以本地方式保存文件
      window.navigator.msSaveBlob(blob, decodeURI(filename));
    } else {
      // 创建新的URL并指向File对象或者Blob对象的地址
      const blobURL = window.URL.createObjectURL(blob);
      // 创建a标签，用于跳转至下载链接
      const tempLink = document.createElement("a");
      tempLink.style.display = "none";
      tempLink.href = blobURL;
      tempLink.setAttribute("download", decodeURI(filename));
      // 兼容：某些浏览器不支持HTML5的download属性
      if (typeof tempLink.download === "undefined") {
        tempLink.setAttribute("target", "_blank");
      }
      // 挂载a标签
      document.body.appendChild(tempLink);
      tempLink.click();
      document.body.removeChild(tempLink);
      // 释放blob URL地址
      window.URL.revokeObjectURL(blobURL);
    }
  } catch (err) {
    console.error(err);
    loading.close();
    Message({
      type: "error",
      message: err,
    });
  }
}
