import React from 'react';
import { message } from 'antd';
import { $http } from 'containers/config/https';
import fetchJsonp from 'fetch-jsonp';
/**
 * Purpose：    用途：同步请求
 * Params：     方法入参
	Nothis：      当前组件this
	code：        请求代码
	data：        请求体 - 没有参数默认可以不传入
	type：        urlDeault - 默认地址   urlADS - 增删改地址    urlS - 查询地址

	* 使用示例：

	getData = async () => {
		let res = await React.$asyncPost(this, '10000', { params: [{....}] });
		console.log(res);
	}
*/
export const asyncPost = function (Nothis, code, data, type = 'urlDeault') {
	if (!code) {
		message.error('请求接口异常，请检查接口代码是否正确！')
		return;
	}
	let initData = {
		params: [{}]
	};
	data = data && 'params' in data ? data : initData;
	return new Promise((resolve, reject) => {
		$http.post(type, Nothis, {
			code: code,
			data: data,
			success: function (res) {
				let errorCode = res.errorCode;
				if (+errorCode === 0) {
					resolve(res);
				} else {
					reject(res);
				}
			},
			error: function (error) {
				reject(error);
			}
		});
	})
};

/**
 * 用途：Dll动态库调用
 * 使用示例：

	getData = async () => {
		let res = await React.$dllPost('AgentFun', data);
		console.log(res);
	}
*/
export const dllPost = function (funcName, data, dllPath = 'ReadYBCard/INSUYBPAY.dll', className = 'INSUYBPAY.INSUYBPAY') {
	const userData = React.$getSessionData();
	data = {
		...data,
		session: [userData],
	}
	let dllParams = "{'inputDir':'" + dllPath + "','clsName':'" + className + "','funcName':'" + funcName + "','dllInput':'" + JSON.stringify(data) + "'}";
	if (typeof (CefSharp) != 'undefined') { // 定制浏览器
		CefSharp.BindObjectAsync('xysCefToJavaScripts');
		return new Promise((resolve, reject) => {
			xysCefToJavaScripts.driveLocalHardware(dllParams).then((returnVale) => {
				let objValue = returnVale && typeof (returnVale) === 'string' ? JSON.parse(returnVale) : returnVale;
				objValue.errorCode = objValue && 'errorCode' in objValue && objValue.errorCode.toString(); //转成String类型
				resolve(objValue)
			})
		})
	} else {
		const frame = chrome?.webview?.hostObjects?.Bridge || ''; // 使用暴露的c#的对象
		return new Promise((resolve, reject) => {
			if (frame) {
				// 获取的属性是proxy promise;
				frame.DynamicLoadingDLL(dllParams)
					.then(
						returnVale => {
							let objValue = returnVale && typeof (returnVale) === 'string' ? JSON.parse(returnVale) : returnVale;
							objValue.errorCode = objValue && 'errorCode' in objValue && objValue.errorCode.toString(); //转成String类型
							resolve(objValue)
						},
						err => {
							console.log(err);
							message.error('新版浏览器动态库调用异常，请稍后再试！');
							reject(err);
						}
					)
			} else {
				fetchJsonp('http://127.0.0.1:62534/XYSWCFService/DynamicLoadingDLL?' + '&input=' + dllParams, {
					jsonpCallback: 'JsonCallback',
					timeout: 500000,
				}).then(function (response) {
					return response.json()
				}).then(function (json) {
					resolve(typeof json === 'string' ? JSON.parse(json) : json);
				}).catch(function (err) {
					reject(err);
					message.error('动态库调用异常，请稍后再试');
				})
			}
		})
	}
}

/**
 * 用途：WebService调用
 * 使用示例：
	xml - 必传 / url - 默认为wsdl
	getData = async () => {
		let res = await React.$wsPost(xml, 'wsdl');
		console.log(res);
	}
*/
export const wsPost = function (xml, url = 'wsdl') {
	return new Promise((resolve, reject) => {
		fetch(url, {
			mode: 'cors',
			method: 'post',
			headers: {
				'Content-Type': 'text/xml',
			},
			body: xml
		})
			.then(response => response.text())
			.then(data => {
				// 如果有调用状态可以在这里判断成功的时候返回resolve
				resolve(data)
			})
			.catch(error => {
				// 可根据实际情况看否直接在这里添加错误提醒
				reject(error);
			});
	})
}