<template>
	<view class="wrapper">
		<view class="list">
			<view><text>账户余额：</text>￥{{state.accountMoney/100}}</view>
			<view><text>ETC卡号：</text>{{state.cardId}}</view>
			<view><text>ETC卡内余额：</text>￥{{card.money/100}}</view>
		</view>
		<view class="input-box">
			<input v-model="state.money" placeholder="请输入金额" class="input" @input="checkNum" />
			<view class="tips">最低圈存金额不小于10元</view>
		</view>
		<view class="tabs">

			<view class="tab-tit">请选择或输入圈存金额：</view>
			<view class="tab">
				<view v-for="(item,index) in state.moneryArray" @click="tableIndexAction(index)" :key="index"
					:class="{'item':state.moneryArray,'active':state.tableIndex===index}">{{item.name}}</view>
			</view>
		</view>
		<view class="btn btn-primary" @click="rechargeAction">立即充值</view>

	</view>
</template>

<script setup lang="ts">
	import {
		stringToJson
	} from "@/utils/network/encryption";
	import {
		onLoad,
		onShow
	} from "@dcloudio/uni-app";
	import {
		quanCheck,
		quanApply,
		quanXf,
		cardCzPayResultCheck,
		cardCzApply,
		cardCzPay,
		cardCzPayResult,
		cardCzXFCheck,
		quanConfirm,
		wechatPayConfigId,
		aliPayConfigId,
		obtainUserId,
		getOpenId,
		accountMoneyApi
	} from "@/utils/network/api.js";
	import {
		request, requestNew
	} from "@/utils/network/request.js";
	import {
		reactive
	} from "vue";
	import {
		navTo
	} from "@/utils/utils"
	import {
		msg
	} from "@/utils/utils";
	import {
		getItem,
		StorageKeys,
		setItem
	} from "@/utils/storage";
	const datas = require("../../../static/etcUtil/datas.js");
	const bluetoothUtil = require("../../../static/etcUtil/index.js");
	const cmd = require("../../../static/etcUtil/cmdConfig.js");
	const tools = require("../../../static/etcUtil/tools.js");
	const NFCAPI = require('../../../static/nfc/NFCAPI.js');

	const state = reactive({
		moneryArray: [{
			name: '50元',
			value: 50
		}, {
			name: '100元',
			value: 100
		}, {
			name: '200元',
			value: 200
		}, {
			name: '300元',
			value: 300
		}, {
			name: '500元',
			value: 500
		}, {
			name: '1000元',
			value: 1000
		}],
		tableIndex: 0,
		openid: "",
		fee: 5000,
		money: 50,
		orderNum: "",
		transWay: "blu", //“blu”为蓝牙充值方式、“nfc”为NFC充值方式
		cardId: "", //卡号 需要传参
		mockpreBalance: 2000, //fix:模拟余额 目前没有检测状态接口，第一次会模拟圈存检测来检测状态
		show: false,
		current: 0,
		// tradeType: 14,
		accountId: "",//对公账户id
		accountMoney: 0,  //对公账户余额
		consumeId: "",//消费订单编号
	});

	//读卡信息
	const card : any = reactive({
		cardId: "",
		netId: "",
		cardType: "",
		startTime: "",
		endTime: "",
		userName: "",
		idNum: "",
		vehiclePlate: "",
		vehiclePlateColor: "",
		color: "",
		version: "",
		type: "",
		favourable: "",
		money: undefined,
		v_userType: "",
	});
	onLoad((option) => {
		state.accountId = option.accountId
		getMoney();
	});

	const getMoney = () => {
		let options = {
			type: 2, //type: 2,JSON格式提交数据(默认表单形式提交)
			data: {
				accountId: state.accountId
			}, //请求参数
			method: "POST", //提交方式(默认POST)
			showLoading: true, //是否显示加载中(默认显示)
		};

		//调用方式
		request(accountMoneyApi, options).then((res) => {
			const data = stringToJson(res.bizContent);
			state.accountMoney = data.money
			getCardId();
		})
			.catch((err) => {
				console.log(err);
			});
	}

	const tableIndexAction = (val : any) => {
		state.tableIndex = val
		state.money = state.moneryArray[val].value
	}
	/*点击充值按钮*/
	const rechargeAction = () => {
		state.fee = state.money * 100; //元换成分
		quanCheckActionTrue().then((val) => {
			checkQuanCengEvent(val);
		});
	};

	/*读卡*/
	const getCardId = () => {
		console.log("======获取卡信息======");
		let cmdArr = [
			cmd.HOME_DIRECTORY,
			//选择主目
			cmd.APPLICATION_DIRECTORY,
			//选择文件1001--DF01联网收费应用目录
			cmd.CMD_READBINARY,
			//15文件--卡片发行基本数据文件
			cmd.CMD_GETBALANCE,
			//钱包
		];
		tools.showLoadingAlert("正在执行指令");
		transCmd(cmdArr, function (res : any) {
			// 只读卡号
			getCardIdReturnReadCard(res)

		})
	};
	function getCardIdReturnReadCard(res : any) {
		tools.hideLoadingAlert();
		//10：写卡   20：写OBU
		let str = res[2].substring(res[2].length - 4, res[2].length);
		let str3 = res[3].substring(res[3].length - 4, res[3].length);
		if (str == "9000" || str3 == "9000") {
			if (res[2].length > 86 || res[3] >= 12) {
				state.cardId = res[2].substring(20, 40); //卡号
				card.cardId = res[2].substring(20, 40); //卡号
				card.money = parseInt(parseInt(res[3].substring(0, 8), 16), 10)
				console.log("======卡信息======", card, state.cardId);
			} else {
				console.error("CMD_READBINARY指令长度不符" + res[2]);
				tools.hideLoadingAlert();
			}
		}
		console.error("CMD_READBINARY指令长度不符" + res[2]);
		tools.hideLoadingAlert();
	}
	const checkQuanCengEvent = (val : any) => {
		if (val.chargeStatus === 1) {
			let cmdArr = val.command.split(",");
			uni.showLoading({
				title: "写入中",
			});
			transCmd(cmdArr, function (res : any) {
				let response = res.toString();
				var dic = {
					command: val.command,
					cosResponse: response,
				};
				uni.hideLoading();
				quanApplyAction(dic).then((value : any) => {
					console.log("圈存申请完后的结果");
					console.log(value.commandType, value);
					state.consumeId = value.consumeId
					//圈存初始化验证通过 , 进行圈存
					if (value.commandType === 2) {
						uanConfirmAction(value);
					} else {
						console.log("第二次70", value)
						let cmdArr = value.command.split(",");
						uni.showLoading({
							title: "写入中",
						});
						transCmd(cmdArr, function (res : any) {
							let response = res.toString();
							var dic = {
								command: val.command,
								cosResponse: response,
							};
							uni.hideLoading();
							quanApplyAction(dic).then((values) => {
								state.consumeId = values.consumeId
								console.log("圈存申请完后的结果");
								uanConfirmAction(values);
							});
						})
					}
				});
			});
		} else {
			let cmdArr = val.command.split(",");
			uni.showLoading({
				title: "写入中",
			});
			transCmd(cmdArr, function (res : any) {
				var status = res[1].substring(res[1].length - 4, res[1].length);
				console.log("打印状态");
				console.log(status);
				if (status === "9000") {
					console.log("修复指令入参");
					let response = res.toString();
					var dic = {
						command: val.command,
						cosResponse: response,
						rechargeId: val.rechargeId,
					};
					quanFixAction(dic).then((value : any) => {
						state.orderNum = value.orderId
						state.tradeType = value.tradeType
						console.log(value);
						console.log("修复结果返回");
						var fixStatus = value.fixStatus;
						//圈存修复COS指令Response信息不足,重新进行修复初始化
						if (fixStatus === 3) {
							let xfcmdArr = value.command.split(",");
							transCmd(xfcmdArr, function (resValueData) {
								var status = resValueData[1].substring(
									resValueData[1].length - 4,
									resValueData[1].length
								);
								console.log("打印状态");
								console.log(status);
								if (status === "9000") {
									console.log(resValueData);
									var valueResponse = resValueData.toString();
									console.log(response);

									var applyDic = {
										command: value.command,
										cosResponse: valueResponse,
										rechargeId: value.rechargeId,
									};
									console.log("消费成功");
									quanApplyAction(applyDic).then((applyValue) => {
										state.consumeId = applyValue.consumeId
										uanConfirmAction(applyValue);
									});
								}
							});
						} else if (fixStatus === 2) {
							uanConfirmSucessAction(value).then((confirmResult) => {
								console.log("充值成功")
								setTimeout(() => {
									msg("充值成功");
									navTo(`/subpackage/after-sale/account-recharge/result?cardId=${card.cardId}`)
								}, 2000)
							});
						} else if (fixStatus === 1) {
							quanCheckActionTrue().then((val) => {
								checkQuanCengEvent(val);
							});
						}
					});
					uni.hideLoading();
				}
			});
		}
	};

	/*透传*/
	const transCmd = (cmd : any, click : any) => {
		if (state.transWay == 'blu') {
			bluetoothUtil.transCmd(cmd, "10", function (res : any) {
				click(res);
			});
		} else {
			//nfc透传
			NFCAPI.transCmd(cmd, function (res : any) {
				tools.hideLoadingAlert();
				if (res.code == 0) {
					click(res.data);
				} else {
					//透传失败返回
					tools.alertF(res.msg);
				}
			});
		}
	};

	const quanCheckActionTrue = () => {
		console.log("进行真实圈存检测");
		var data = {
			cardId: card.cardId,
			fee: state.fee,
			preBalance: card.money,
			tradeType: 12,
		};
		const options = {
			type: 2,
			data: data,
			method: "POST",
			showLoading: true,
		};
		return new Promise(async (resolve, reject) => {
			const res = await request(quanCheck, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};

	/*充值消费*/
	const cardCzXFCheckAction = () => {
		var data = {
			cardId: card.cardId, //修复初始化的指令
			openId: getItem(StorageKeys.OpenId), //修复初始化结果
			orderNum: state.orderNum, //充值流水号
		};
		const options = {
			type: 2,
			data: data,
			method: "POST",
			showLoading: true,
		};
		return new Promise(async (resolve, reject) => {
			const res = await request(cardCzXFCheck, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};
	/*圈存修复*/
	const quanFixAction = (val) => {
		var data = {
			command: val.command, //修复初始化的指令
			cosResponse: val.cosResponse, //修复初始化结果
			rechargeId: val.rechargeId, //充值流水号
		};
		const options = {
			type: 2,
			data: data,
			method: "POST",
			showLoading: true,
		};
		return new Promise(async (resolve, reject) => {
			const res = await request(quanXf, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};
	/*圈存申请*/
	const quanApplyAction = (data) => {
		console.log("圈存申请data====", data, data.rechargeId)
		var form = {
			cardId: card.cardId,
			fee: state.fee,
			preBalance: card.money,
			tradeType: 12,
			command: data.command,
			cosResponse: data.cosResponse,
			orderId: state.orderNum,
			rechargeId: data.rechargeId,
			openId: getItem(StorageKeys.OpenId),
			accountId: state.accountId
		};
		const options = {
			type: 2,
			data: form,
			method: "POST",
			showLoading: true,
		};

		return new Promise(async (resolve, reject) => {
			const res = await request(quanApply, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};
	/*圈存确认*/
	const uanConfirmAction = (data : any) => {
		console.log("圈存确认进入");
		let cmdArr = data.command.split(",");
		console.log(cmdArr);
		transCmd(cmdArr, function (res : any) {
			console.log("圈存透传");
			console.log(res);
			var arraylenth = res.length;
			var status = res[arraylenth - 1].substring(
				res[arraylenth - 1].length - 4,
				res[arraylenth - 1].length
			);
			console.log("打印圈存确认指令状态");
			if (status === "9000") {
				var form = {
					command: data.command,
					cosResponse: res.toString(),
					rechargeId: data.rechargeId,
					paidAmount: state.fee,
					giftAmount: 0,
					consumeId: state.consumeId,
					tradeType: 12,
					accountId: state.accountId
				};
				const options = {
					type: 2,
					data: form,
					method: "POST",
					showLoading: true,
				};
				return new Promise(async () => {
					const res = await request(quanConfirm, options);
					const data = stringToJson(res.bizContent);
					console.log("data充值成功", data);
					setTimeout(() => {
						msg("充值成功");
						navTo(`/subpackage/after-sale/account-recharge/result?cardId=${card.cardId}`)
					}, 2000)
				}).catch((error) => {
					console.log('输出内容', error)
				});
			}
		});
	};

	const uanConfirmSucessAction = (data) => {
		var form = {
			command: data.command,
			cosResponse: "9000",
			rechargeId: data.rechargeId,
			paidAmount: state.fee,
			giftAmount: 0,
			tradeType: 12,
			accountId: state.accountId

		};
		const options = {
			type: 2,
			data: form,
			method: "POST",
			showLoading: true,
		};
		return new Promise(async (resolve, reject) => {
			const res = await request(quanConfirm, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
			console.log("uanConfirmSucessAction", data)
		}).catch((error) => {
			reject(error);
		});
	};

	/*充值检测*/
	const czCheckAction = () => {
		var form = {
			cardId: state.cardId,
			openId: getItem(StorageKeys.OpenId),
		};
		const options = {
			type: 2,
			data: form,
			method: "POST",
			showLoading: true,
		};

		return new Promise(async (resolve, reject) => {
			const res = await request(cardCzPayResultCheck, options);
			const data = stringToJson(res.bizContent);
			console.log("充值检测", data)
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};
	/*充值申请*/
	const cardCzApplyAction = () => {
		var data = {
			cardId: state.cardId,
			openId: getItem(StorageKeys.OpenId),
			rechargeMoney: state.fee,
		};
		const options = {
			type: 2,
			data: data,
			method: "POST",
			showLoading: true,
		};
		return new Promise(async (resolve, reject) => {
			const res = await request(cardCzApply, options);
			const data = stringToJson(res.bizContent);
			resolve(data);
		}).catch((error) => {
			reject(error);
		});
	};

	//获取微信小程序openid
	const getOpenID = () => {
		uni.login({
			provider: "weixin",
			success: function (e) {
				getOpenid(e.code);
			},
			fail: function () {
				msg("获取不到oppenId，请检查AppID和Secret是否争取");
			},
		});
	};
	const getOpenid = (code) => {
		const options = {
			type: 2,
			data: {
				"jsCode": code
			},
			method: "POST",
			showLoading: true,
		};
		// #ifdef MP-WEIXIN
		requestNew(getOpenId, options).then((res) => {
			const result = stringToJson(res.bizContent);
			console.log("获取微信小程序openid", result);
			const openidData = stringToJson(result.data);
			state.openid = openidData.openid
		});
		// #endif
	}
	//掉起微信支付
	const wxPayment = () => {
		// #ifdef MP-WEIXIN
		const options = {
			type: 2,
			data: {
				openId: getItem(StorageKeys.OpenId),
				wxOpenId: state.openid,
				cardId: state.cardId,
				orderNum: state.orderNum,
				payConfigId: wechatPayConfigId,
				body: "储值卡充值",
			},
			method: "POST",
			showLoading: true,
		};
		request(cardCzPay, options).then((res) => {
			const data = stringToJson(res.bizContent);
			uni.requestPayment({
				provider: "wxpay",
				orderInfo: "",
				timeStamp: data.timestamp,
				nonceStr: data.noncestr,
				package: data.wxPackage ? data.wxPackage : "",
				signType: data.signType,
				paySign: data.sign,
				success: function () {
					//回调订单状态
					console.log("回调订单状态");
					checkOrder();
				},
				fail: function (err) {
					confirm(err, () => { }, "支付失败", false);
				},
			});
		});
		// #endif
	};
	//掉起支付宝支付
	const aliPayment = () => {
		// #ifdef MP-ALIPAY
		my.getAuthCode({
			scopes: 'auth_base',
			success: res => {
				const optionsUser = {
					type: 2,
					data: {
						payConfigId: aliPayConfigId,
						code: res.authCode
					},
					method: "POST",
					showLoading: true,
				};
				request(obtainUserId, optionsUser).then((res) => {
					const data = stringToJson(res.bizContent);
					const optionsali = {
						type: 2,
						data: {
							openId: getItem(StorageKeys.OpenId),
							wxOpenId: data.openId,
							cardId: state.cardId,
							orderNum: state.orderNum,
							payConfigId: "6a9a54123456578934edfre132b1234",
							body: "储值卡充值",
						},
						method: "POST",
						showLoading: true,
					};
					request(cardCzPay, optionsali).then((res) => {
						const data = stringToJson(res.bizContent);
						my.tradePay({
							// 调用统一收单交易创建接口（alipay.trade.create），获得返回字段支付宝交易号 trade_no
							tradeNO: data.tranPackage,
							success: res => {
								console.log("支付成功", res);
								checkOrder();
							},
							fail: res => {
								confirm(res, () => { }, "支付失败", false);
							},
						});

					});
				});
			},
			fail: err => {
				console.log('my.getAuthCode 调用失败', err)
			}
		});

		// #endif
	};

	//支付成功改变订单状态
	const checkOrder = () => {
		const options = {
			type: 2,
			data: {
				cardId: state.cardId,
				openId: getItem(StorageKeys.OpenId),
				orderNum: state.orderNum,
			},
			method: "POST",
			showLoading: true,
		};
		request(cardCzPayResult, options).then((res) => {
			const data = stringToJson(res.bizContent);
			if (data.tradeState === "SUCCESS") {
				getCardId();
			}
			console.log(data);
		});
	};
	const goRecord = () => {
		uni.navigateTo({
			url: `/subpackage/personal-center/consumption-record?cardId=${state.cardId}`
		})
	}
	// 校验金额输入框
	const checkNum = (event) => {
		let sNum = event.target.value.toString(); //先转换成字符串类
		if (sNum.indexOf('.') == 0) {//第一位就是 .
			console.log('first str is .')
			sNum = '0' + sNum
		}
		sNum = sNum.replace(/[^\d.]/g, "");  //清除“数字”和“.”以外的字符
		sNum = sNum.replace(/\.{2,}/g, "."); //只保留第一个. 清除多余的
		sNum = sNum.replace(".", "$#$").replace(/\./g, "").replace("$#$", ".");
		sNum = sNum.replace(/^(\-)*(\d+)\.(\d\d).*$/, '$1$2.$3');//只能输入两个小数
		//以上已经过滤，此处控制的是如果没有小数点，首位不能为类似于 01、02的金额
		if (sNum.indexOf(".") < 0 && sNum != "") {
			sNum = parseFloat(sNum);
		}
		console.log('输入的值1', sNum)
		setTimeout(() => {
			state.money = sNum
		}, 20)

	}
</script>

<style>
	.account {
		height: 224rpx;
		width: 690rpx;
		margin: 30rpx;
		position: relative;
	}

	.account .account-text {
		display: flex;
		justify-content: space-between;
		padding: 20rpx 50rpx;
		height: 100%;
	}

	.account .balance {
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: flex-start;
		color: #ffffff;
	}

	.account .balance-tit {
		font-size: 26rpx;
		margin-bottom: 10rpx;
	}

	.account .balance-val {
		font-size: 56rpx;
	}

	.account .right-box {
		display: flex;
		flex-direction: column;
		justify-content: flex-start;
		align-items: flex-end;
	}

	.account .right-box .no {
		font-size: 26rpx;
		color: #ffffff;
	}

	.account .right-box .btn {
		font-size: 26rpx;
		padding: 0 20rpx;
		box-sizing: border-box;
		height: 42rpx;
		line-height: 42rpx;
		color: #28d20f;
		background: #ffffff;
		border-radius: 21rpx;
		display: inline-block;
		margin-top: 18rpx;
	}

	.account .head-bg {
		width: 690rpx;
		height: 224rpx;
		position: absolute;
		left: 0;
		top: 0;
		z-index: -99;
	}

	.input-box {
		display: flex;
		flex-direction: column;
		justify-content: center;
		align-items: center;
		padding: 20rpx 0;
	}

	.input-box .input {
		width: 430rpx;
		height: 98rpx;
		line-height: 98rpx;
		background: #f8f8f8;
		border: 1px solid #999999;
		border-radius: 6rpx;
		font-size: 30rpx;
		text-align: center;
	}

	.input-box .tips {
		color: #666666;
		font-size: 26rpx;
		margin-top: 18rpx;
	}

	.tabs {}

	.tabs .tab-tit {
		font-size: 30rpx;
		color: #333;
		padding: 45rpx 0 22rpx 30rpx;
	}

	.tabs .tab {
		display: flex;
		flex-wrap: wrap;
		justify-content: space-evenly;
	}

	.tabs .tab .item {
		width: 210rpx;
		height: 100rpx;
		background: #f6fff7;
		border: 1px solid #dcdde1;
		box-sizing: border-box;
		line-height: 100rpx;
		border-radius: 6rpx;
		text-align: center;
		margin-bottom: 24rpx;
		color: #333333;
		font-size: 32rpx;
	}

	.tabs .tab .item.active {
		border: 1px solid #24cc49;
		color: #24cc49;
	}

	.btn-primary {
		width: 670rpx;
		height: 80rpx;
		line-height: 80rpx;
		background: linear-gradient(-90deg, #43a1e0 0%, #13e7c1 100%);
		border-radius: 40rpx;
		font-size: 32rpx;
		color: #ffffff;
		margin: 200rpx 40rpx 0;
		text-align: center;
	}

	.uni-list {
		padding: 120rpx 10rpx 0 10rpx;
		font-size: 34rpx;
	}

	label {
		display: flex;
		justify-content: space-between;
		margin-top: 30rpx;
	}

	.list {
		width: 97%;
		padding: 20rpx 50rpx;
		font-size: 30rpx;
		background-color: #f8f8f8;
		margin-bottom: 20rpx;
	}
</style>