import axios from 'axios';
import jsCookie from 'js-cookie';
import { ulid } from 'ulid';

import { apiBaseUrl } from '../config';

import throwErrorCodeApi from './throwErrorCodeApi';

const baseURL = apiBaseUrl;
const apis = [
  '/ccc/web/reg',
  '/tcccadmin/satisfaction/getByWeb',
  '/ccc/im/botSearchInput',
  '/tccclogin/visitor/webReg',
  '/ccc/user/startSession',
];

export const getAuthorization = (url: string) => {
  const userKey = localStorage.getItem('TCCCImUserKey');
  if (url !== '/tccclogin/visitor/webReg' && userKey) {
    return `Bearer ${userKey}`;
  }
  return undefined;
};
// const dispatch = store.dispatch
const options = {
  baseURL,
  withCredentials: true,
  timeout: 10000,
  headers: {
    'Content-Type': 'application/json',
  },
};
const setCsrfToken = (token: string, domain: string) => {

  jsCookie.set('csrf-token', token, {
    domain,
    sameSite: 'none',
    secure: true,
  });
};
export const getCsrfToken = () => {
  let token = jsCookie.get('csrf-token');
  if (!token) {
    token = `${Math.random()}`;
    const { hostname } = window.location;
    const testDomain = 'test.cccweb.pstn.avc.qcloud.com';
    const preDomain = 'pre.cccweb.pstn.avc.qcloud.com';
    const prodDomain = [
      'ccc.cloud.tencent.cn',
      'ccc.cloud.tencent.com.cn',
      'tccc.qcloud.com',
      'connect.tencentcloud.com',
    ];
    if (process.env.NODE_ENV === 'development' || [testDomain, preDomain].includes(hostname)) {
      setCsrfToken(token, 'qcloud.com');
    } else if (prodDomain.includes(hostname)) {
      setCsrfToken(token, hostname);
    } else {
      setCsrfToken(token, 'qcloud.com');
    }
  }
  return token;
};

const axiosInstance = axios.create(options);

axiosInstance.interceptors.request.use(
  (config) => {
    Object.assign(config.headers!, {
      'X-Csrf-Token': getCsrfToken(),
    });
    return config;
  },
  (err) => Promise.reject(err),
);

const createApiFunction =
  (url: string) =>
    (data: any = {}) => {
      const { cancelToken, ...options } = data;
      const id = ulid();
      const authorization = getAuthorization(url);

      return axiosInstance
        .request({
          method: 'post',
          url,
          cancelToken,
          data: {
            nonce: id,
            requestId: id,
            ...options,
          },
          ...(authorization && { headers: { authorization } }),
        })
        .then((response) => {
          if (Number(response.data.errorCode) === 0) {
            return response.data;
          }
          if (throwErrorCodeApi.includes(url)) {
            throw response.data;
          } else {
            throw response.data.msg;
          }
        })
        .catch((error) => {

          if (url !== '/ccc/debug/seatLog') {
            debugLogRequest(`[${url}请求失败,${error} ,${error.errorCode} , ${error.msg}]`);
          }
          // eslint-disable-next-line no-underscore-dangle
          if (error.__CANCEL__) {
            console.warn(error);
          } else if (throwErrorCodeApi.includes(url)) {
            throw error;
          } else {
            console.error(error);
          }
          throw error;
        });
    };

const returnServices = (apis: string[]) => {
  const services: { [propName: string]: any } = {};
  apis.forEach((url) => {
    services[url] = createApiFunction(url);
  });
  return services;
};

// 由于部分下载数据接口与获取数据接口相同，因此另起一个downloadServices

function debugLogRequest(log: string) {
  const seatLog = `[webIm:${log}]`;

}

export { debugLogRequest };
export default returnServices(apis);
