import { tradeNoForOrder, tradeResult, tradeNoQuery } from "../service/common";

const tradePay = function (params, option = {}) {
	// eslint-disable-next-line no-param-reassign
	option = Object.assign(
		{
			useBalance: false,
			useMedicare: false,
			tradeType: "Appointment", // Outpatient: 门诊缴费; Appointment: 挂号、充值
		},
		option
	);
	console.log(params, option);

	if (option.tradeType === "Appointment") {
		/**
		 * params 挂号 : { type: 1, idNum: '', depName: '' }
		 * params 充值 : { type: 2, idNum: '', amount: 0 }
		 */
		return appointment(params);
	} else {
		/**
		 * params : { outTradeNo }
		 */
		return outpatient(params);
	}
}; // 挂号,充值类订单

function appointment(params) {
	return tradeNoQuery(params).then(_tradePay);
} // 门诊类订单

function outpatient(params) {
	const {
		hisPatientId,
		age,
		sex,
		orderId,
		hisOrderNo,
		amount,
		deptName,
		doctorName,
		doctorCode,
		total,
		hisClinicCode,
		name,
		prescribeDate,
	} = params;
	return tradeNoForOrder({
		useBalance: params.useBalance,
		// 是否使用就诊卡余额
		useMedicare: params.useMedicare,
		// 是否使用医保卡余额
		outTradeNo: params.outTradeNo, // 商家订单号
		// 新增参数
		hisPatientId,
		age,
		sex,
		orderId,
		hisOrderNo,
		amount,
		deptName,
		doctorName,
		doctorCode,
		total,
		hisClinicCode,
		name,
		prescribeDate,
	}).then((tradeData) => {
		if (tradeData.tradeNo) {
			// 发起支付
			return _tradePay(tradeData);
		} else {
			return Promise.resolve(
				compareResult({
					success: true,
				})
			);
		}
	});
} // 处理支付结果

function compareResult(param) {
	console.log(param);

	if (!param.success) {
		my.showToast({
			type: "fail",
			content: param.payRes.memo || "订单支付失败",
		});
	}

	return param.success;
}

function _tradePay(
	tradeData = {
		tradeNo: "",
		outTradeNo: "",
	}
) {
	return new Promise((resolve, reject) => {
		my.tradePay({
			tradeNO: tradeData.tradeNo,

			success(payRes) {
				// 4000 订单处理失败
				// 6001 用途中途取消支付
				// 6002 网络链接出错
				if (
					payRes.resultCode === "4000" ||
					payRes.resultCode === "6002" ||
					payRes.resultCode === "6001"
				) {
					// 支付失败
					reject(
						compareResult({
							success: false,
							payRes,
						})
					);
				} else {
					// 其他情况调用接口确认
					triggerPay({
						tradeNo: tradeData.tradeNo,
						outTradeNo: tradeData.outTradeNo,
						resultCode: payRes.resultCode,
					}).then((r) => {
						if (r.status === "TRADE_SUCCESS") {
							resolve(
								compareResult({
									success: true,
									payRes,
								})
							);
						} else {
							reject(
								compareResult({
									success: false,
									payRes,
								})
							);
						}
					});
				}
			},

			fail: (payRes) => {
				// 订单支付异常
				reject(
					compareResult({
						success: false,
						payRes,
					})
				);
			},
		});
	});
} // 验证支付结果

function triggerPay(param) {
	return tradeResult(param);
}

export default {
	tradePay,
};