const ENV = require('./env.js');
/*
{
    baseUrl: '',
    header: {},
    method: 'GET',
    dataType: 'json',
    // #ifndef MP-ALIPAY || APP-PLUS
    responseType: 'text',
    // #endif
    // 注：如果局部custom与全局custom有同名属性，则后面的属性会覆盖前面的属性，相当于Object.assign(全局，局部)
    custom: {}, // 全局自定义参数默认值
    // #ifdef MP-ALIPAY || MP-WEIXIN
    timeout: 30000,
    // #endif
    // #ifdef APP-PLUS
    sslVerify: true,
    // #endif
    // #ifdef H5
    // 跨域请求时是否携带凭证（cookies）仅H5支持（HBuilderX 2.6.15+）
    withCredentials: false,
    // #endif
    // 局部优先级高于全局，返回当前请求的task,options。请勿在此处修改options。非必填
    // getTask: (task, options) => {
    // 相当于设置了请求超时时间500ms
    //   setTimeout(() => {
    //     task.abort()
    //   }, 500)
    // }
  }*/
// 此vm参数为页面的实例，可以通过它引用vuex中的变量
module.exports = (vm) => {
	
    // 初始化请求配置
    uni.$u.http.setConfig((config) => {
		
		//console.log(config);
        /* config 为默认全局配置*/
        config.baseURL = ENV.ApiUrl; /* 根域名 */
		config.custom = {
			auth:true,
			toast:true,
			};
        return config
    })
	
	// 请求拦截
	uni.$u.http.interceptors.request.use((config) => { // 可使用async await 做异步操作
	    // 初始化请求拦截器时，会执行此方法，此时data为undefined，赋予默认{}
	    config.data = config.data || {}
		// 根据custom参数中配置的是否需要token，添加对应的请求头
		if(config?.custom?.auth) {
			const token = uni.getStorageSync('token');
			if(token.length > 0)
			{
				config.header.token = token;
			}
		}
	    return config 
	}, config => { // 可使用async await 做异步操作
	    return Promise.reject(config)
	})
	
	// 响应拦截
	uni.$u.http.interceptors.response.use((response) => { /* 对响应成功做点什么 可使用async await 做异步操作*/
		//console.log('请求返回',response);
		//这里只针对阿里云oss上传没有返回值的时候做个处理
		if(response.header.Server == "AliyunOSS" && response.errMsg == "uploadFile:ok" && uni.$u.test.isEmpty(response.data))
		{
			return {
				code:200,
				msg:"上传OSS成功",
				data:{},
			};
		}
		const data = response.data
		// 自定义参数
		const custom = response.config?.custom
		if (data.code !== 200) { 
			// 如果没有显式定义custom的toast参数为false的话，默认对报错进行toast弹出提示
			if (custom.toast !== false) {
				uni.$u.toast(data.msg)
			}
		
			// 如果需要catch返回，则进行reject
			if (custom?.catch) {
				return Promise.reject(data)
			} else {
				// 否则返回一个pending中的promise，请求不会进入catch中
				return new Promise(() => { })
			}
		}
		return data.data === undefined ? {} : data.data
	}, (response) => { 
		//console.log(response);
		// 对响应错误做点什么 （statusCode !== 200）
		if(response.statusCode == 920)
		{
			// 假设201为token失效，这里跳转登录
			uni.$u.toast('用户信息验证失败，请重新登录');
			setTimeout(() => {
				// 此为uView的方法，详见路由相关文档
				uni.reLaunch({
					url:'/pages/index/index',
				})
			}, 1500)
			
		}
		else if(response.statusCode == 500)
		{
			// 假设201为token失效，这里跳转登录
			uni.$u.toast('当前接口出错');
			
		}
		else
		{
			
			// 如果返回false，则会调用Promise的reject回调，
			// 并将进入this.$u.post(url).then().catch(res=>{})的catch回调中，res为服务端的返回值
			uni.$u.toast('当前接口状态码'+response.statusCode);
			
		}
		return Promise.reject(response)
	})
}