import User from '../model/User';
import serverLog from '../log/ServerLog';
import {AXIOS_HTTP_ERROR,TPLUS_HTTP_999,TPLUS_LOGIN_ERROR} from '../log/LogEventIds';
import UIConfirm from '../components/UIConfirm';
import bizError from  '../bizError';
import _findIndex from 'lodash/findIndex';
import {stores} from 'mutants-microfx';
import {noErrorTips} from '../const/app';
import { Toast } from 'antd-mobile';

const QS = require('qs');
// import {env} from 'mutants-microfx';
// const {constant,platform,browser,os} = env;

const config = {
  proxy: {
    'throughProxy': false,
    'error': {
      "10101": "连接服务器超时",
      "10107": "T+服务器网络不给力，请确认T+云应用下云应用设置-服务器网络连接是否成功",
      "10104": "企业id不存在",
      "10106": "用户信息认证失败",
      "10108": "用户信息认证失败",
      "10109":"服务器内部错误",
      "T10108":"用户信息认证失败"
    }
  },
  cia: {
    'error': {
      '20109':'账号或密码错误',
      '20129':'账号或密码错误',
      '10002':'账号或密码错误',
      '20024':'密码输入错误次数超过10次，账号被锁定，请十五分钟之后再试！',
      '10001':'格式错误',
      '10004':'非空参数错误',
      '10005':'JSON格式错误',
      '10006':'appKey错误',
      '10007':'appSecret错误',
      '20001':'注册来源不存在',
      '20119':'账号或密码错误',
      '20122':'用户昵称被占用',
      '20123':'用户不在组织内',
      '20203':'组织的账号被占用',
      '20204':'企业id不存在',
      '20231':'企业全称已存在',
      '20305':'appKey没有访问权限',
      '20306':'应用不存在',
      '25015':'未授权的 客户端',
      '50000':'服务器内部异常',
      '20911':'友空间服务出现异常，正在紧急修复中，请稍后重试。'
    }
  },
  axios_error:{
      error_signs:['timeout of '],
      error_tips:['请求超时,请稍候再试!']
  },
  skip_error:[
      'chanjet.Authorization.Logout'
  ],
  login_method:[
      'chanjet.EAP.GZQ.CSP.GetTPlusToken',
      'chanjet.MB.MBPortal.GetPortalByAppid'
  ]
}

const errorShow = (message:string,callback? :()=>any) => {
      UIConfirm.show(message,()=>{
        callback && callback();
      });
}

const reloginErrorCodes = ['EXSM0001','EXSM0002','EXSM0003','EXSM0004','EXSM0005'];
// const authReloginErrorCodes = ['EXERROR0001'];//没有权限
// else if(authReloginErrorCodes.some(reloginErrorCode=>{return reloginErrorCode===tplusErrorCode})){
//   errorShow(error.Message,()=>{
//     User.logout();
//   });
// }
const tplus999Handler = (axios, err) => {

  

  // 处理T+返回的异常
  const response = err.response;
  if (response.status === 999) {

      const error = response.data.Error;
      const tplusErrorCode = error.Code;
      //上传阿里云日志  登录异常不记录
      const {data:requestData,baseURL} = err.config;
      const data = QS.parse(requestData);
      const apis = JSON.parse(data.Apis);
      const methodName = apis.Method;
      if(reloginErrorCodes.some(reloginErrorCode=>{return reloginErrorCode===tplusErrorCode})){
        errorShow('登录信息异常，请保存当前操作数据后，重新进入应用!',()=>{
          User.logout(null,false);
        });
      }else if('Login1040' === tplusErrorCode){
        errorShow('可用量正在整理，不能登录，请稍后再试！',()=>{
          User.logout();
        });
      }else if('EXSV0011'=== tplusErrorCode){
        //提供的服务名称不正确  将异常抛给前端的业务捕获
        console.error('error.Message======',error.Message);
      }else if(bizError.indexOf(tplusErrorCode)>-1){
        //业务异常不做处理
      }else if(_findIndex(config.login_method , method => method === methodName)>-1){
        
        let errorMsg = error && !!error.Message ? error.Message :'登录信息异常，请保存当前操作数据后，重新进入应用!';
        
        const eventId = TPLUS_LOGIN_ERROR;
        const logParam = {baseURL,eventId,bodyData:JSON.stringify(data),errorMsg};
        serverLog(stores.logStore.logParam.logStore,logParam);
        
        errorShow(errorMsg,()=>{
          if(apis.Args && apis.Args.NoLogout){
            return;
          }
          User.logout(null,false);
        });
      }else{
        if(stores.logStore.isUpload(baseURL)){
          let bodyData = JSON.stringify(data);
          if(bodyData.length > 4096){
            if(data.Apis){
              bodyData = JSON.stringify({Method:methodName,Body:bodyData.substr(0,4096)});
            }
          }
          const eventId = TPLUS_HTTP_999;
          const logParam = {baseURL,eventId,bodyData,...error};
          serverLog(stores.logStore.logParam.logStore,logParam);
        }

        errorShow(error.Message);
      }
  }else{
    Toast.info('当前网络不可用，请检查网络设置', 1);
  }
};

const ciaErrorHandler = (axios, res) => {
    var errorMsg = config.cia.error[res.errorCode];
    if(errorMsg){
        errorShow(`CIA接口调用异常:${errorMsg},ErrorCode:${res.errorCode}`);
    }else{
        let errorMsg = (typeof res == 'object'?JSON.stringify(res):res);
        errorShow(`CIA接口调用异常:返回结果${errorMsg},ErrorCode:${res.errorCode}`);
    }
}

const cloudProxyHandler = (axios, res)  => {
  var errorMsg = config.proxy.error[res.code];

  const {targetURL} = window.localStorage;
  const eventId = TPLUS_LOGIN_ERROR;
  const logParam = {targetURL,eventId,bodyData:JSON.stringify(res),errorMsg};
  serverLog(stores.logStore.logParam.logStore,logParam);

  if(exitApp(res.code)){
      return;
  }
        
  if(errorMsg){
    errorShow(errorMsg);
  }else{
    errorShow('云代理接口调用异常:返回结果'+res);
  }
}

const exitApp = (code:string,error? :string)=>{
  var msg = config.proxy.error[code];
  if(msg){
    if(error){
      msg = error;
    }
    errorShow(msg,()=>{
      //User.logout();
    });
    return true;
  }
  return false;
}

const middleware = function (axios) {
    axios.interceptors.response.use(
     
        function logResponse(res) {
          const isSkipService = config.skip_error.some((item)=>{
            return res.request.responseURL.indexOf(item) > -1;
          });
          if(isSkipService){
            return res;
          }

          // console.log('%c Request Success:', 'color: #4CAF50; font-weight: bold', res);
              //setLoading(false);
              //处理CIA返回的异常  状态码是200
            if(res.data){
              if(res.data.hasOwnProperty("errorCode")){
                  ciaErrorHandler(axios,res.data);
                  return Promise.reject(res.data);
              }
              //处理云代理返回的异常
              if(res.data.hasOwnProperty("code") && res.config.baseURL.indexOf('cloudproxy01.chanapp.chanjet.com') > -1){
                  cloudProxyHandler(axios,res.data);
                  return Promise.reject(res.data);
              }
            }
            return res;
        },

        function logPromiseError(err) {
            // const isSkipService = config.skip_error.some((item)=>{
            //   return res.request.responseURL.indexOf(item) > -1;
            // });
            // if(isSkipService){
            //   return res;
            // }
            // console.log('%c Request Error:', 'color: #EC6060; font-weight: bold', err);
            //处理T+返回的异常
            if (err&&err.response&&err.response.status === 999) {
                if(err.response.data&&err.response.data.Error&&err.response.data.Error.Code){
                  if(exitApp(err.response.data.Error.Code,err.response.data.Error.Message)){
                    return;
                  }
                }
                tplus999Handler(axios, err);
                return Promise.reject(err.response.data.Error);
            }
            if (/Network Error/.test(err.toString())){
                const {baseURL} = err.config;
                const cancelErrorTips = noErrorTips.some((noErrorTip)=>{
                  return baseURL.indexOf(noErrorTip) > -1;
                });
                if(!cancelErrorTips){
                  Toast.info('网络繁忙，请稍后下拉刷新操作', 1);
                }
            }else{
              const errorMsg = err.message;
              const {data:requestData,baseURL} = err.config;
              //当请求参数为空时  也要上传相关日志 帮助分析是哪个接口调用异常
              let bodyData = '';
              if(stores.logStore.isUpload(baseURL)){
                if(!!requestData){
                  bodyData = JSON.stringify(QS.parse(requestData));
                }
                const eventId = AXIOS_HTTP_ERROR;
                const logParam = {baseURL,eventId,bodyData,errorMsg};
                serverLog(stores.logStore.logParam.logStore,logParam);
              }

              //增加对getTplusToken接口的特殊处理，如果出现访问异常，提示用户进行检测
              try{
                if(!!requestData){
                  const data = QS.parse(requestData);
                  const methodName = JSON.parse(data.Apis).Method;
                  
                  if(_findIndex(config.login_method,method=>method === methodName)>-1){
                    errorShow(config.proxy.error['10107'],()=>{
                        //User.logout();
                    });
                    return;
                  }
                }
              }catch(err){
                console.error('response-interceptor.logPromiseError=====',err);
              }
              
              

              //将请求框架的提示语转化成中文，方面客户理解
              const needReTip =  _findIndex(config.axios_error.error_signs,sign=>{
                return !!errorMsg && errorMsg.indexOf(sign) > -1;
              });

              //是否需要弹出提示框 某些地方不需要提示出来  比如上传阿里云的错误
              const cancelErrorTips = noErrorTips.some((noErrorTip)=>{
                return baseURL.indexOf(noErrorTip) > -1;
              })
              if(!cancelErrorTips){
                //解决部分外围接口报错  没有带请求参数  不影响到主体业务使用  就不显示错误提示框了  暂时先用requestData判断下
                //主要针对pos 偶发性弹出接口超时的提示  临时的解决方案  后续待改进
                if(!!requestData){
                  if(needReTip > -1){
                    errorShow(config.axios_error.error_tips[needReTip]);
                  }else{
                    errorShow(errorMsg);
                  }
                }
              }
              return Promise.reject(err);
            }
        }
    );
};

export default middleware;
