const NET = require('./request')
const API = require('../config/api')
// #ifdef H5
const jweixin = require('jweixin-module')

/**
 * 普通H5处理
 * @param payInfo 结算返回的支付信息
 */

async function payH5InEquipment(payInfo) {
	try {
		const res = await NET.request(API.gotoH5Pay, payInfo, 'POST')
		location.replace(res.data.mwebUrl)
	} catch (e) {
		this.submitActive = true
		uni.showToast({
			title: '支付失败',
			icon: 'none'
		})
		uni.navigateTo({
			url: '/pages_category_page1/orderModule/index?type=1'
		})
	} finally {
		uni.hideLoading()
	}
}

/**
 * 微信内H5处理
 * @param payInfo 结算返回的支付信息
 * @param orderId 订单ID
 */

async function payH5InWechat(payInfo) {
	payInfo.paymentMode = 1
	const res = await NET.request(API.gotoPay, payInfo, 'POST')
	jweixin.config({
		debug: false, // 开启调试模式,调用的所有api的返回值会在客户端alert出来，若要查看传入的参数，可以在pc端打开，参数信息会通过log打出，仅在pc端时才会打印。
		appId: res.data.appId, // 必填，公众号的唯一标识
		timestamp: res.data.timeStamp, // 必填，生成签名的时间戳
		nonceStr: res.data.nonceStr, // 必填，生成签名的随机串
		signature: res.data.paySign, // 必填，签名，见附录1
		jsApiList: [ 'chooseWXPay' ] // 必填，需要使用的JS接口列表，所有JS接口列表见附录2
	})
	jweixin.ready(function () {
		jweixin.checkJsApi({
			jsApiList: [ 'chooseWXPay' ], // 需要检测的JS接口列表，所有JS接口列表见附录2,
			success(res) {
			},
			fail(res) {
			}
		})
		jweixin.chooseWXPay({
			timestamp: res.data
				.timeStamp, // 支付签名时间戳，注意微信jssdk中的所有使用timestamp字段均为小写。但最新版的支付后台生成签名使用的timeStamp字段名需大写其中的S字符
			nonceStr: res.data.nonceStr, // 支付签名随机串，不长于 32 位
			package: res.data
				.package, // 统一支付接口返回的prepay_id参数值，提交格式如：prepay_id=***）
			signType: res.data.signType, // 签名方式，默认为'SHA1'，使用新版支付需传入'MD5'
			paySign: res.data.paySign, // 支付签名
			success(res) {
				// 支付成功后的回调函数
				uni.showToast({
					icon: 'none',
					title: '支付成功'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/paySuccessful?orderId=' + payInfo.orderId
				})
			},
			cancel(r) {
				uni.showToast({
					icon: 'none',
					title: '用户取消支付'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/index?type=1'
				})
			},
			fail(res) {
				uni.showToast({
					icon: 'none',
					title: '微信内支付错误'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/index?type=1'
				})
			}
		})
	})
	jweixin.error(function (res) {
		uni.showToast({
			icon: 'none',
			title: '微信内支付加载失败',
			duration: 3000
		})
		uni.navigateTo({
			url: '/pages_category_page1/orderModule/index?type=1'
		})
	})
}

/**
 * H5拉起支付
 * @param payInfo 结算返回的支付信息
 */

async function h5Pay(payInfo) {
	const ua = navigator.userAgent.toLowerCase()
	if (ua.match(/MicroMessenger/i) == 'micromessenger') {
		await payH5InWechat(payInfo)
	} else {
		await payH5InEquipment(payInfo)
	}
}

// #endif

// #ifdef MP-ALIPAY
/**
 * 支付宝小程序拉起支付
 * @param payInfo 结算返回的支付信息
 * @return {Promise<void>}
 */

async function aliPay(payInfo) {
	try {
		const res = await NET.request(API.gotoPay, payInfo, 'POST')
		uni.requestPayment({
			provider: 'alipay',
			orderInfo: res.data.tradeNo,
			success(payRes) {
				if (payRes.resultCode == '6001') {
					uni.showToast({
						icon: 'none',
						title: '取消支付'
					})
					uni.navigateTo({
						url: '/pages_category_page1/orderModule/index?type=1'
					})
				}
				if (payRes.resultCode == '9000') {
					uni.showToast({
						icon: 'none',
						title: '支付成功'
					})
					uni.navigateTo({
						url: '/pages_category_page1/orderModule/paySuccessful?orderId=' + orderId
					})
				}
			},
			fail(err) {
				uni.showToast({
					icon: 'none',
					title: '支付取消'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/index?type=1'
				})
			}
		})
	} catch (e) {
		uni.showToast({
			title: '支付宝支付异常',
			icon: 'none'
		})
		uni.navigateTo({
			url: '/pages_category_page1/orderModule/index?type=1'
		})
	} finally {
		uni.hideLoading()
	}
}

// #endif

// #ifdef MP-WEIXIN
/**
 * 微信小程序拉起支付
 * @param payInfo
 * @return {Promise<void>}
 */

async function wechatPay(payInfo) {
	try {
		const res = await NET.request(API.gotoPay, payInfo, 'POST')
		uni.requestPayment({
			provider: 'wxpay',
			timeStamp: res.data.timeStamp,
			nonceStr: res.data.nonceStr,
			package: res.data.package,
			signType: res.data.signType,
			paySign: res.data.paySign,
			success: async (payRes) => {
				// 拼团微信支付成功回调
				if (payInfo.collageId) {
					await NET.request(API.paySuccess, {
						orderId: payInfo.orderId,
						collageId: payInfo.collageId
					}, 'POST')
				}
				uni.showToast({
					icon: 'none',
					title: '支付成功'
				})
				// console.log(submitResult.orderId, 'order Id')
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/paySuccessful?orderId=' + payInfo.orderId
				})
			},
			fail(err) {
				uni.showToast({
					icon: 'none',
					title: '用户取消支付'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/index?type=1'
				})
			}
		})
	} catch (e) {
		uni.showToast({
			title: '微信支付拉起失败',
			icon: 'none'
		})
		uni.navigateTo({
			url: '/pages_category_page1/orderModule/index?type=1'
		})
	}
}

// #endif

// #ifdef APP-PLUS
/**
 * App拉起微信支付
 * @param payInfo
 * @return {Promise<void>}
 */

async function appWechatPay(payInfo) {
	try {
		const res = await NET.request(API.gotoAppPay, payInfo, 'POST')
		const obj = {
			appid: res.data.appId,
			noncestr: res.data.nonceStr,
			package: 'Sign=WXPay',
			prepayid: res.data.prepayId,
			timestamp: res.data.timeStamp,
			sign: res.data.paySign,
			partnerid: res.data.partnerId
		}
		uni.requestPayment({
			provider: 'wxpay',
			orderInfo: obj,
			success(payRes) {
				uni.showToast({
					icon: 'none',
					title: '支付成功'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/paySuccessful?orderId=' + payInfo.orderId
				})
			},
			fail(err) {
				uni.showToast({
					icon: 'none',
					title: '用户取消支付'
				})
				uni.navigateTo({
					url: '/pages_category_page1/orderModule/index?type=1'
				})
			}
		})
	} catch (e) {
		uni.showToast({
			title: 'APP拉起微信支付失败',
			icon: 'none'
		})
		uni.navigateTo({
			url: '/pages_category_page1/orderModule/index?type=1'
		})
	} finally {
		uni.hideLoading()
	}
}

// #endif

/**
 * 处理支付
 * @param submitResult 结算结果
 */

export async function handleDoPay(submitResult) {
	uni.showLoading({
		mask: true,
		title: '支付中...'
	})
	const { paymentMode } = submitResult
	if (paymentMode === 1) {
		// 微信支付
		// #ifdef APP-PLUS
		await appWechatPay(submitResult)
		// #endif
		// #ifdef MP-WEIXIN
		await wechatPay(submitResult)
		// #endif
		// #ifdef H5
		await h5Pay(submitResult)
		// #endif
	} else if ([2, 3].includes(paymentMode)) {
		// 支付宝
		// #ifdef MP-ALIPAY
		await aliPay(submitResult)
		// #endif
		// #ifndef MP-ALIPAY
		// await appWechatPay(submitResult,this.orderId)
		console.error('支付宝相关支付暂时只支持支付宝小程序')
		throw new Error('支付宝相关支付暂时只支持支付宝小程序')
		// #endif
	}
	// #ifndef H5
	// setTimeout(()=>{
	//     uni.navigateTo({
	//         url: '/pages_category_page1/orderModule/index?type=2'
	//     })
	// },1000)
	// #endif
	/*  uni.navigateTo({
          url: '/pages_category_page1/orderModule/index?type=2'
      })*/
	// uni.hideLoading()
}
