import axios from 'axios';
import { koiMsgError } from "@/utils/koi.ts";
import { LOGIN_URL } from "@/config/index.ts";
import useUserStore from "@/stores/modules/user.ts";
import { getToken } from "@/utils/storage.ts";
import { tansParams } from "@/utils/ruoyi.ts";
import router from "@/routers/index.ts";
import { saveAs } from "file-saver"
import { koiNoticeSuccess, koiNoticeInfo } from "@/utils/koi.ts";

axios.defaults.headers['Content-Type'] = 'application/json;charset=utf-8'
// 创建 axios 实例
const service = axios.create({
  baseURL: import.meta.env.VITE_WEB_BASE_API,
  timeout: 10000
});

// 请求拦截器
service.interceptors.request.use(
  (config: any) => {
    const token = getToken();
    if (token) {
      config.headers['Authorization'] = 'Bearer ' + token;
    }
    if (config.responseType) {
      config.headers['responseType'] = config.responseType
    }
    // get请求映射params参数
    if (config.method === 'get' && config.params) {
      let url = config.url + '?' + tansParams(config.params);
      url = url.slice(0, -1);
      config.params = {};
      config.url = url;
    }
    return config;
  },
  error => {
    console.log(error);
    return Promise.reject(error);
  }
);

// 响应拦截器
service.interceptors.response.use(res => {
    // 未设置状态码则默认成功状态
    const code = res.data.code || 200;
    // 获取错误信息
    const msg = res.data.msg || '请求未知错误'
    // 二进制数据则直接返回
    if(res.request.responseType ===  'blob' || res.request.responseType ===  'arraybuffer'){
      return res.data
    }
    else if (code === 200) {
      return res.data;
    }
    else if (code === 401) {
      const userStore = useUserStore();
      userStore.setToken("");
      koiMsgError("登录身份过期，请重新登录");
      router.replace(LOGIN_URL);
      return Promise.reject(new Error(res.data));
    }
    else {
      koiMsgError(msg || "服务器错误");
      return Promise.reject(msg || "服务器错误");
    }
  },
  error => {
    // 处理网络错误，不是服务器响应的数据
    error.data = {};
    if (error && error.response) {
      switch (error.response.status) {
        case 400:
          error.data.msg = "错误请求";
          koiMsgError(error.data.msg);
          break;
        case 403:
          error.data.msg = "对不起，您没有权限访问";
          koiMsgError(error.data.msg);
          break;
        case 404:
          error.data.msg = "请求错误,未找到请求路径";
          koiMsgError(error.data.msg);
          break;
        case 405:
          error.data.msg = "请求方法未允许";
          koiMsgError(error.data.msg);
          break;
        case 408:
          error.data.msg = "请求超时";
          koiMsgError(error.data.msg);
          break;
        case 500:
          error.data.msg = "服务器500异常，请重试";
          koiMsgError(error.data.msg);
          break;
        case 501:
          error.data.msg = "网络未实现";
          koiMsgError(error.data.msg);
          break;
        case 502:
          error.data.msg = "网络错误";
          koiMsgError(error.data.msg);
          break;
        case 503:
          error.data.msg = "服务不可用";
          koiMsgError(error.data.msg);
          break;
        case 504:
          error.data.msg = "网络超时";
          koiMsgError(error.data.msg);
          break;
        case 505:
          error.data.msg = "http版本不支持该请求";
          koiMsgError(error.data.msg);
          break;
        default:
          error.data.msg = `连接错误${error.response.status}`;
          koiMsgError(error.data.msg);
      }
    } else {
      error.data.msg = "连接到服务器失败";
      koiMsgError(error.data.msg);
    }
    // 将错误返回给 try{} catch(){} 中进行捕获，就算不进行捕获，上方 res.data.status != 200 也会抛出提示。
    return Promise.reject(error);
  }
);

// 通用下载方法
export function download(url:string, data:any, filename:string) {
  koiNoticeInfo('正在获取数据...', '温馨提示', 0)
  service({
    url: url,
    method: 'post',
    data,
    responseType: 'blob',
  }).then(res => {
    koiNoticeSuccess('开始下载文件...')
    const blob = new Blob([res])
    saveAs(blob, filename)
  })
}


export default service;
