/* eslint-disable */
import axios from 'axios'
export default class Requester {
  constructor($domain) {
    if ($domain) {
      this.domain = $domain
    }
  }
  domain = ''
  axios = null
  headers = {}
  static commonAxiosInstance = null
  static initAxios(config = {}) {
    this.commonAxiosInstance = axios.create(config)
    return this.commonAxiosInstance
  }
  setDomain($domain) {
    this.domain = $domain
  }
  setHeaders(headers = {}, replace = false) {
    if (replace) {
      this.headers = headers;
    } else {
      this.headers = {
        ...this.headers,
        ...headers,
      }
    }
  }
  setAxios($axios) {
    this.axios = $axios
  }
  checkAxios() {
    if (!this.axios) {
      if (!Requester.commonAxiosInstance) {
        Requester.initAxios()
      }
      this.axios = Requester.commonAxiosInstance
    }
  }
  checkRequestParams(requestParams) {
    const {
      method = 'get',
        host = this.domain,
        path,
        query = {},
        body = {},
        config = {
          headers: this.headers,
        },
    } = requestParams
    let requestMethod = method.toLowerCase()
    let requestUrl = host + path
    let urlParams = query
    if (requestMethod === 'get') {
      urlParams = {
        ...query,
        ...body,
      }
    }
    let resuestOptions = {
      ...config,
      _originRequestParams: requestParams,
      headers: {
        ...this.headers,
        ...(config.headers || {})
      },
      body,
      params: urlParams,
    }
    if (requestMethod === 'delete') {
      resuestOptions.data = resuestOptions.body
      delete resuestOptions.body
    }
    return {
      requestMethod,
      requestUrl,
      resuestOptions,
    };
  }
  request(requestParams) {
    this.checkAxios();
    const {
      requestMethod,
      requestUrl,
      resuestOptions,
    } = this.checkRequestParams(requestParams);
    if (!['get', 'post', 'put', 'delete', 'head', 'option', 'patch'].includes(requestMethod)) {
      return Promise.reject(new Error('Not supported request method: ' + requestMethod))
    }
    if (['post', 'put', 'patch'].includes(requestMethod)) {
      return this.axios[requestMethod](requestUrl, resuestOptions.body, resuestOptions)
    }
    // requestMethod === 'get' || requestMethod === 'head' || requestMethod === 'option' || requestMethod === 'delete'
    return this.axios[requestMethod](requestUrl, resuestOptions)
  }
}