/**
 * request 网络请求工具
 * 更详细的 api 文档: https://github.com/umijs/umi-request
 */
import request from 'umi-request';
import { notification } from 'antd';
import apis from '../services/apis';
import mixStr from './mixStr';

const codeMessage = {
  200: '服务器成功返回请求的数据。',
  201: '新建或修改数据成功。',
  202: '一个请求已经进入后台排队（异步任务）。',
  204: '删除数据成功。',
  400: '发出的请求有错误，服务器没有进行新建或修改数据的操作。',
  401: '用户没有权限（令牌、用户名、密码错误）。',
  403: '用户得到授权，但是访问是被禁止的。',
  404: '发出的请求针对的是不存在的记录，服务器没有进行操作。',
  406: '请求的格式不可得。',
  410: '请求的资源被永久删除，且不会再得到的。',
  422: '当创建一个对象时，发生一个验证错误。',
  500: '服务器发生错误，请检查服务器。',
  502: '网关错误。',
  503: '服务不可用，服务器暂时过载或维护。',
  504: '网关超时。',
};

const replaceURLParams = (url, params = {}) => {
  return Object.keys(params).reduce((acc, k) => { // 此方法对每个元素进行处理
    const re = new RegExp(`:${k}(?!w)`, 'i')
    return acc.replace(re, params[k])
  }, url)
}

request.interceptors.request.use((url, options) => {
  const { urlData, headers = {}, logout = false, login = false, action, data, ...opts } = options
  const apiURL = urlData ? replaceURLParams(url, urlData) : url
  const token = mixStr(window.localStorage.getItem('test-foobar-center'))

  if (login || logout) {
    window.localStorage.removeItem('test-foobar-center')
  }

  const authHeader = !login ? { Authorization: `Bearer ${token}` } : {}
  const actionHeader = action ? { 'X-ACTION': action  }: {}

  return (
    {
      url: apiURL,
      options: {
        ...opts,
        headers: {
          ...authHeader,
          ...actionHeader,
          ...headers,
        },
        data,
        requestType: data instanceof FormData ? 'form' : 'json',
        credentials: 'include', // 带 cookie
        interceptors: true,
        getResponse: true,
      },
    }
  );
});

request.interceptors.response.use(async (response, options) => {

  if (response && response.status) {
    if (response.status != 200) {
      const errorText = codeMessage[response.status] || response.statusText;
      const { status, url } = response;
      notification.error({
        message: `请登录系统 ${status}: ${url}`,
        description: errorText,
      });
      throw new Error(response.statusText);
    } else {
      console.log('response.headers: ', response.headers)
      console.log('response.headers.Content-Type: ', response.headers.get('Content-Type'))
      if (response.headers.get('Content-Type') === 'application/octet-stream;charset=utf-8') {
        return await response.clone().blob();
      }

      const { code, data, message } = await response.clone().json();
      if (code != 1000) {
        if (code === 1001) {
          // notification.error({
          //   message: `请登录系统`,
          //   // description: '请登录系统',
          // });
          // throw new Error('请登录系统');
        } else {
          notification.error({
            message: message,
            // description: message,
          });
          throw new Error(message);
        }
      }

      if (data && data.token) {
        window.localStorage.setItem('test-foobar-center', mixStr(data.token))
      }

      return data;
    }
  } else if (!response) {
    notification.error({
      description: '您的网络发生异常，无法连接服务器',
      message: '网络异常',
    });
  }
});


const fetch = api => options => request(api.url, {...api, ...options || {}})

export default config => {
  if (typeof config === 'string') {
    return request(config);
  } else {
    const {url, ...options} = config;
    return request(url, options);
  }
};

export { fetch, apis }
