// import common = require("./common");
// const appid = 'wxefa2810018787a41'
const appid = '487987498'

const language = 'zh'

var common = require('./common.js');

var storage = require('./storage.js');

var config = require('./config.js'); // 检查token是否失效 如失效 清除缓存 提示重新登录

// 402: 解析token出错  403: token格式错误  404: 公共声明中缺少必要字段  405: token验证失败
import crypto from '@/node_modules/crypto-js';
function _checkTokenValid(res) {
	if(res.data.code === 305){
		uni.showToast({
			title:'账号已在其他设备登录!',
			icon:'none'
		})
		return false
	}
	if (
		res.data.code === 402 ||
		res.data.code === 403 ||
		res.data.code === 404 ||
		res.data.code === 405 ||
		res.data.code === 300 ||
		res.data.code === 302 ||
		res.data.code === 303 ||
		res.data.code === 304 ||
		res.data.code === 305 ||
		res.data.code === 306
	) {
		//wx.clearStorageSync();

		//TODO
		// var shareCode = storage.getShareCode();
		// storage.clearStorage();
		// storage.setShareCode(shareCode);
		storage.removeUserToken()
		uni.removeStorageSync('car_info')
		uni.removeStorageSync('USER_INFO_DATA')
		uni.reLaunch({
			url: '/pages/loginRegister/login'
		});
		return false;
	}

	return true;
}

function getRequest(url, data, successCallBack, failCallBack) {
// function getRequest(url1, data, successCallBack, failCallBack) {
	if (!failCallBack) failCallBack = function() {};
	// var url=url1?url1:''
	if (url.indexOf('?') > 0) {
		url = url + '&' + common.obj2UrlQuery(data);
	} else {
		url = '?' + common.obj2UrlQuery(data);
		// return
	}
	uni.request({
		url: url,
		method: 'GET',
		success: function(res) {
			uni.hideLoading();
			if(res.data.code == 200){
					successCallBack(res);
					return
			}
			if(res.data.code === 503){
				return
			}
			if (_checkTokenValid(res)) {
				successCallBack(res);
			}
		},
		fail: function(res) {
			uni.hideLoading();

			if (!(res.errMsg.indexOf('interrupted') != -1)) {
				uni.showModal({
					title: '错误',
					content: '网络错误' + res.errMsg,
					showCancel: false
				});
			}

			if (failCallBack) failCallBack(res);
		}
	});
}

function postRequest(url, data, successCallBack, failCallBack) {
	const datetime = Math.floor(Date.now() / 1000)
	data.time = datetime.toString()
	let jsonStr = JSON.stringify(selfSort(data))
	var encrypted = crypto.SHA256(jsonStr)
	var sign = encrypted.toString()
	if (!failCallBack) failCallBack = function() {}
	var token = storage.getUserToken()
	
	// 申请拖车服务接口加密签名校验
	// if (url === config.API_DAYHIRE_DRAG_CAR_SERVICE) {
		data.sign = sign
	// }
	
	uni.request({
		url: url,
		data: data,
		header: {
			'content-type': 'application/json',
			'X-Token': token
		},
		method: 'POST',
		success: function(res) {
			//wx.hideLoading();
			if (res.data.code == 200) {
				res.succeed = true
				res.body = res.data
				successCallBack(res);
				return
			} else if(res.data.code === 503){
				return
			} else {
				successCallBack(res);
				if(res.data.msg){
					uni.showToast({ title: res.data.msg, icon: 'none' })
				}
				
				return
			}
			if (_checkTokenValid(res)) {
				successCallBack(res);
			}
		},
		fail: function(res) {
			uni.hideLoading();

			if (!(res.errMsg.indexOf('interrupted') != -1)) {
				uni.showModal({
					title: '错误',
					content: '网络错误' + res.errMsg,
					showCancel: false
				});
			}
			failCallBack(res);
		}
	});
}

function selfSort(data) {
	// console.log(data,"签名数据")
	let sortedKeys = Object.keys(data).sort((a, b) => {
		//对key 进行翻转
		let reversedA = a.split("").reverse().join("");
		let reversedB = b.split("").reverse().join("");
		let len = reversedA.length > reversedB.length ? reversedA.length : reversedB.length

		for (let i = 0; i < len; i++) {
			if (typeof(reversedA[i]) == 'undefined') {
				return 1;
			}
			if (typeof(reversedB[i]) == 'undefined') {
				return -1;
			}
			if (reversedA[i] > reversedB[i]) {
				return -1;
			} else if (reversedB[i] > reversedA[i]) {
				return 1;
			}
		}
		return 1
	}) // 对属性数组进行排序
	let sortedJson = {}; // 重构排序后的JSON对象
	sortedKeys.forEach(key => {
		sortedJson[key] = data[key];
	})
	return sortedJson
}

function getApi(url, data, successCallBack, failCallBack) {
	var token = storage.getUserToken(); //wx.getStorageSync(config.STORAGE_USER_TOKEN)
	data.token = token;
	data.v = config.APP_VERSION;
	data.appid =  appid
	data.from = 'app'
	//#ifdef MP-ALIPAY
	data.from = 'ali'
	//#endif
	//#ifdef MP-WEIXIN
	data.from = 'wx'
	//#endif
	
	data.language = language
	getRequest(url, data, successCallBack, failCallBack);
}

function postApi(url, data, successCallBack, failCallBack) {
	var token = storage.getUserToken(); // wx.getStorageSync(config.STORAGE_USER_TOKEN)
	data.token = token;
	data.v = config.APP_VERSION;
	data.appid = appid
	data.from = 'app'
	//#ifdef MP-ALIPAY
	data.from = 'ali'
	//#endif
	//#ifdef MP-WEIXIN
	data.from = 'wx'
	//#endif
	data.language = language
	postRequest(url, data, successCallBack, failCallBack);
}
/**
 * 上报formid
 */

function reportFormId(formId) {
	const accountInfo = uni.getAccountInfoSync();
	var postData = {
		formId: formId,
		appid
	};
	postApi(config.API_FORMID_REPORT, postData, function() {});
}

function getAppConfig(successCallBack) {
	const pData = {
		appid,
		terminal: 'wx_app'
	};
	getApi(config.API_INDEX_APP_CONFIG, pData, function(resp) {
		if (resp.data.code === 200) {
			const appConfig = resp.data.data.appConfig;
			storage.setAppConfig(appConfig);
			successCallBack(appConfig)
			//#ifdef MP-ALIPAY
			uni.setNavigationBarTitle({
				title: ''
			});
			//#endif
			//#ifdef MP-WEIXIN
			wx.setNavigationBarTitle({
				title: appConfig.app_name
			});
			//#endif
		}else{
		}
	});
}


module.exports = {
	getRequest: getRequest,
	postRequest: postRequest,
	getApi: getApi,
	postApi: postApi,
	reportFormId: reportFormId,
	getAppConfig: getAppConfig
};