import axios from 'axios';
var QS = require('qs');
import tools from '../util/tools';
import User from '../model/User';
import UIConfirm from '../components/UIConfirm';
//param post参数  method 方法  isJsonString 是否转换为json字符串  isFree 是否需要认证信息
const tplusAjaxReq = (param:object, method:string, isJsonString?:boolean, isFree?:boolean, query?:string , axiosRequestConfig?:any) =>{
    param = param || {};
    method = method || '';
    isJsonString = isJsonString || false;

    let requestObj = {};
    //调用REST  传递的是单参数  String类型
    if(true==isJsonString) {
      requestObj = QS.stringify({
        'Apis':JSON.stringify({
          'Args':{
            'Param':JSON.stringify(param)
          },
          'Method':method
        })
      });
    } else {
      requestObj = QS.stringify({
          'Apis': JSON.stringify({
              'Args': param,
              'Method': method
          })
      });
    }
    
    if(!User.isLogined()){
      UIConfirm.show(`用户信息丢失,请保存当前操作数据后，重新登录!`,()=>{
        User.logout(null,false);
      });
      return;
    }
    const user = User.restore();
    let config = {baseURL: user.channel.targetURL};
    if(axiosRequestConfig){
      config = {...config,...axiosRequestConfig}
    }
    var ajax = axios.create(config);
    var url = 'api/rest';
    if(isFree){
      url = url + '?IsFree=1&methodName='+method+'&userId='+user.userId +'&orgId='+user.orgId;
    }else{
      url = url + '?methodName='+method+'&userId='+user.userId +'&orgId='+user.orgId;
    }
    var user_req_id =`${user.userId}x${new Date().getTime().toString(16)}`;
    url +=  '&user_req_id=' + user_req_id;
    
    if(query){
      url += '&' + query;
    }
    const startTime = new Date().getTime();
    return  ajax.post(url, requestObj)
        .then(resp=>{
            const endTime = new Date().getTime();
            console.log(`tApi:请求接口[${method}]成功,消耗时间${endTime - startTime}ms,时间${tools.sysTime()}`);
            return Promise.resolve(resp);
        }).catch(err => {
            const endTime = new Date().getTime();
            console.error(`tApi:请求接口[${method}]失败,消耗时间${endTime - startTime}ms,时间${tools.sysTime()},错误信息->`,err);
            return Promise.reject(err);
        });
}

const tplusApi = async (param:object, method:string, isJsonString?:boolean, isFree?:boolean, query?:string , axiosRequestConfig?:any):Promise<object|string> => {
  const resp = await tplusAjaxReq(param,method,isJsonString,isFree, query, axiosRequestConfig);
  if(resp == undefined){
    return "";
  }
  let json = resp.data.Value;
  if(typeof(json) == 'string'){
    if(tools.isJsonStr(json)){
      json = JSON.parse(resp.data.Value);
    }
  }
  return json;
}

export default tplusApi;