import APIClient from './APIClient';
import userDataStorage from '../userDataStorage';
import Utils from '../Utils';

class AJAXHelper {
	constructor() { }

	static genMockDataUrl(name) {
		let config = require('../../res/values/api.json');
		return config.mock_url + name + '.json';
	}

	static genAPIUrl(path, method, data) {
		const cfg = require('../../res/values/api.json');
		if (method == 'GET' && data) {
			let queryStrArr = [];
			for (let key in data) {
				queryStrArr.push(`${key}=${data[key]}`);
			}
			return `${cfg.api_url}${path}?${queryStrArr.join('&')}`;
		} else {
			return `${cfg.api_url}${path}`;
		}
	}

	static whenAJAXResponse(url, method, data, httpRequest, callback) {
		if (httpRequest.readyState != 4) {
			return;
		}
		let res = JSON.parse(httpRequest.responseText);
		// Token失效,使用deviceCode刷新Token后再继续请求
		if (res.code === 31003) {
			const params = { deviceCode: localStorage.getItem('deviceCode') };
			AJAXHelper.put('/token', params, (isTrue, res) => {
				if (!isTrue) return;
				if (!res.success) return;
				userDataStorage.setData(res.data);
				AJAXHelper.request(url, method, data, callback);
			});
		} else {
			callback(httpRequest.status == 200, res);
		}
	}

	static request(path, method, data, callback) {
		//读取本地用户信息,生成本次请求所需参数
		const { token = '', uid = '', eid = '' } = userDataStorage.getData() || {};
		const forSignStr = `path=${path}&uid=${uid}&eid=${eid}&${token}`;
		const sign = CryptoJS.MD5(forSignStr).toString();
		const requestId = Utils.uuid(32, 16);
		//判断当前平台
		let platform = 'tv';
		if (!window.efunbox) {
			platform = 'web';
		}
		let url = AJAXHelper.genAPIUrl(path, method, { eid, uid, terminal: platform, ...data });

		let xmlHttpReq = new XMLHttpRequest();
		xmlHttpReq.open(method, url, true);
		//构造请求头(每个请求都带的公共参数)
		xmlHttpReq.setRequestHeader('eid', eid);
		xmlHttpReq.setRequestHeader('uid', uid);
		xmlHttpReq.setRequestHeader('sign', sign);
		xmlHttpReq.setRequestHeader('terminal', platform);
		xmlHttpReq.setRequestHeader('merchant', 'baby');
		xmlHttpReq.setRequestHeader('requestId', requestId);
		xmlHttpReq.setRequestHeader('Authentication', sign); //header中增加Authentication以兼容老版本
		xmlHttpReq.setRequestHeader('Content-Type', 'application/' + (method == 'POST' || method == 'PUT' ? 'json' : 'text'));
		//构造请求体
		let sendBody = null;
		if (data && (method == 'POST' || method == 'PUT')) {
			sendBody = JSON.stringify({ eid, uid, terminal: platform, ...data });
		}
		//收到响应回调处理
		xmlHttpReq.onreadystatechange = function () {
			AJAXHelper.whenAJAXResponse(path, method, data, xmlHttpReq, callback);
		};
		//发送请求
		xmlHttpReq.send(sendBody);
	}

	static get(path, params, callback) {
		AJAXHelper.request(path, 'GET', params, callback);
	}

	static delete(path, params, callback) {
		AJAXHelper.request(path, 'DELETE', params, callback);
	}

	static post(path, params, callback) {
		AJAXHelper.request(path, 'POST', params, callback);
	}

	static put(path, params, callback) {
		AJAXHelper.request(path, 'PUT', params, callback);
	}
}

module.exports = AJAXHelper;