import { BaseRequest } from '../base/base-request';

import { axios } from './axios';

import type { IBaseRequestOptions, IBaseRequestParam } from '../types';


/**
 * web端Post请求发送类，基于axios
 */
export  class WebRequest extends BaseRequest {
  private readonly axios: any;

  constructor(options: IBaseRequestOptions) {
    super(options);
    const config = {
      withCredentials: options?.extra?.withCredentials !== false, // 跨域送cookie
      transformResponse: [this.transformJson],
    };
    this.axios = axios.create(config);
  }

  doSend(param: IBaseRequestParam): Promise<any> {
    return this.axios({
      method: param.method ? param.method : 'post',
      headers: param.headers ? param.headers : {},
      url: param.url,
      data: param.reqData,
      params: param.method === 'get' && param.reqData ? param.reqData : {},
      // 支持透传axios参数
      ...param.extra?.axiosParam,
    });
  }

  /**
   * 字符串转化为json对象
   * @param data
   */
  transformJson(data: any) {
    if (typeof data === 'string') {
      try {
        // eslint-disable-next-line no-new-func
        data = (new Function('', `return ${data}`))(); // 高效解析，比eval安全些
      } catch (e) {
        console.log(e);
        try {
          data = JSON.parse(data); // 失败时（极少数情况），再尝试常规解析
        } catch (e) {
          console.log(e);
        }
      }
    }
    return data;
  }
}
