<template>
	<view class="weightPages">
		<view class="table">
			<view class="text">
				<image src="/static/zhong.png"></image>
				<text @click="openBluetoothAdapter">{{bleTipsText}}</text>
			</view>
			<view class="duan" @click="handleBack" v-if="isShow&&isConnection == 2">
				断开连接
			</view>
		</view>
		<view class="name">{{name}}</view>
		<!-- 蓝牙称重 -->
		<view class="weight-wrap">
			<view class="weight" @click="inputDialogToggle">
				<text class="val">{{weight == '' ? '0.0':weight}}</text>
				<text class="unit">{{unitConversion(unit)}}</text>
			</view>
			<view class="weight">
				<text class="val">{{kcal?kcal:0}}</text>
				<text class="unit">kcal</text>
			</view>
		</view>
		<view class="groupbtn">
			<view class="btn danwei">
				<view class="lan border-bottom">
					<view class="right">
						<picker mode="selector" :range="unitA" range-key="name" @change="changleUnits"
							:value="unitListIndex">
							<view class="uni-input">
								单位
							</view>
						</picker>
					</view>
				</view>
			</view>
			<view class="btn" @click="handleDetailSub" :style="{'width':!stopblue?'20%':'45%'}">保存</view>
			<view class="btn" @click="handleDetailNext" v-if="!stopblue">下一味</view>
			<view class="btn qingling" @click="handleqingling">清零</view>
		</view>
		<view>
			<uni-popup ref="popup" type="dialog">
				<uni-popup-dialog mode="input" title="重量" placeholder="请输入食物重量" @close="close"
					@confirm="confirm"></uni-popup-dialog>
			</uni-popup>
		</view>
	</view>
</template>

<script>
	import {
		mapState
	} from "vuex";
	export default {
		data() {
			return {
				kcal: "",
				weightALL: "",
				bleTipsText: "",
				unit: 'g',
				unitA: [],
				stopblue: false,
				unitListIndex: 0,
			}
		},
		props: {
			weightKcal: {
				type: Number,
				default: 0 //当前测量食物每g含的kcal
			},
			isLast: {
				type: Boolean,
				default: false
			},
			name: {
				type: String,
				default: ''
			}
		},
		computed: {
			...mapState(["user", "isBluetoothTyle", "bleValue"]),
			weight() {
				let weightNew = this.convertToGrams(this.bleValue.countWeight, this.bleValue.unit)
				this.kcal = (Number(this.weightKcal) * weightNew).toFixed(1)
				this.unit = this.bleValue.unit
				return this.bleValue.countWeight
			},
			isConnection() {
				this.bleTipsText = this.bleValue.bleTipsText
				return this.bleValue.isConnectStatus
			},
			isShow() {
				return this.bleValue.serviceId != '' ? true : false
			},
		},
		mounted() {
			let that = this
			uni.onBluetoothAdapterStateChange(function(res) {
				that.$store.commit("changeBluetooth", res.available);
			})
		},
		watch: {
			isBluetoothTyle: function() {
				let that = this
				if (!that.isBluetoothTyle) {
					that.handleBack()
				}
			},
			isLast: {
				handler(newVal, oldVal) {
					this.stopblue = newVal
				},
				// deep: true,
				immediate: true

			},
			bleValue: {
				handler(newVal, oldVal) {
					this.unitA = newVal.unitList
					this.unitListIndex = newVal.unitList.findIndex(ite => ite.unit == newVal.unit)
				},
				deep: true,
				immediate: true
			},
		},
		methods: {
			// 初始化蓝牙
			openBluetoothAdapter() {
				let that = this
				if (that.isConnection == 0) return
				that.kcal = ""
				that.$store.commit('changeBluetoothValue', {
					deviceId: "",
					serviceId: "",
					notify: '',
					write: '',
					unit: "g",
					type: 1,
					unitList: that.$json.unitMinus,
					countWeight: "",
					bleTipsText: "蓝牙搜索中",
					isConnectStatus: 0,
				})
				that.$ble.openBluetoothAdapter()
			},
			changleUnits(e) {
				let that = this
				let name = that.unitA[e.detail.value].name
				let val = that.unitA[e.detail.value].unit
				if (that.isShow && that.unit != name) {
					that.handletoggleUnit(that.unitConversion2(val))
				}
				if (that.bleValue.serviceId == '') {
					that.unitListIndex = [e.detail.value]
					that.$store.commit('changeBluetoothValue', {
						unit: that.unitA[e.detail.value].unit,
					})
				}
			},
			convertToGrams(value, fromUnit) {
				const conversionFactors = {
					'lb': 453.59237, // 1磅 = 453.59237克
					'oz': 28.349523125, // 1盎司 = 28.349523125克
					'kg': 1000, // 1公斤 = 1000克
					'g': 1,
					'ml': 1,
					'斤': 500,
					'Waterml': 1,
					'milkml': 1.03
				};

				if (!conversionFactors.hasOwnProperty(fromUnit)) {
					return ''
				}

				return value * conversionFactors[fromUnit];
			},
			unitConversion2(unit) {
				if (unit == 'kg') {
					return 0x00
				} else if (unit == '斤') {
					return 0x01
				} else if (unit == 'st:lb') {
					return 0x02
				} else if (unit == 'lb') {
					return 0x03
				} else if (unit == 'g') {
					return 0x04
				} else if (unit == 'ml') {
					return 0x05
				} else if (unit == 'Waterml') {
					return 0x06
				} else if (unit == 'milkml') {
					return 0x07
				} else if (unit == 'oz') {
					return 0x08
				} else if (unit == 'floz') {
					return 0x09
				} else if (unit == 'lboz') {
					return 0x0A
				}
				return unit
			},
			// 下发单位
			handletoggleUnit(unit) {
				let that = this
				let checksum = 0;
				const bytes = [0xC5, 0x03, 0x05, 0x11]
				bytes[4] = unit
				for (let i = 0; i < bytes.length; i++) {
					checksum ^= bytes[i];
				}
				bytes[5] = checksum
				that.sendData(new Uint8Array(bytes).buffer)
			},
			handleqingling() {
				let that = this
				let str = "C503071100D0"
				let buf = new Uint8Array(str.match(/[\da-f]{2}/gi).map(function(h) {
					return parseInt(h, 16)
				}))
				that.sendData(buf.buffer)
			},
			sendData(buffer) {
				let that = this
				uni.writeBLECharacteristicValue({
					deviceId: that.bleValue.deviceId,
					serviceId: that.bleValue.serviceId,
					characteristicId: that.bleValue.write,
					value: buffer,
					success: res => {
						console.log('下发指令成功', res.errMsg)
					},
					fail: res => {
						console.log("下发指令失败", res);
					},
				})
			},
			handleBack() {
				let that = this
				that.$store.commit("changeBluetoothValue", {
					bleTipsText: "连接失败，点击重新连接",
					unitList: that.$json.unitMinus,
					isConnectStatus: 1,
				})
				that.$ble.stopBluetoothDevicesDiscovery() //取消蓝牙搜索
				that.$ble.closeBLEConnection(that.bleValue.deviceId)
				that.$ble.closeBluetoothAdapter()
			},

			unitConversion(unit) {
				if (unit == 'kg') {
					return '千克'
				} else if (unit == '斤') {
					return '斤'
				} else if (unit == 'stlb') {
					return 'stlb'
				} else if (unit == 'lb') {
					return '磅'
				} else if (unit == 'g') {
					return '克'
				} else if (unit == 'ml') {
					return '毫升'
				} else if (unit == 'Waterml') {
					return 'Waterml'
				} else if (unit == 'milkml') {
					return 'milkml'
				} else if (unit == 'oz') {
					return '盎司'
				} else if (unit == 'floz') {
					return 'floz'
				} else if (unit == 'lboz') {
					return 'lboz'
				}
				return unit
			},
			// 备料完成
			handleDetailSub() {
				let that = this
				if (Number(that.weight) > 0) {
					that.$emit("handleDetailSub", that.weight, that.unit, that.kcal)
				} else {
					that.$tools.msg("数据异常，请清零后重新测量!")
				}
			},
			//备料下一个
			handleDetailNext() {
				let that = this
				if (Number(that.weight) > 0) {
					that.$emit("handleDetailNext", that.weight, that.unit, that.kcal)
				} else {
					that.$tools.msg("数据异常，请清零后重新测量!")
				}
			},
			confirm(value) {
				console.log(value)
				let that = this
				this.$store.commit("changeBluetoothValue", {
					countWeight: value,
					unit: this.unitA[this.unitListIndex].unit
				})
				this.$refs.popup.close()
			},
			close() {
				this.$refs.popup.close()
			},
			inputDialogToggle() {
				this.$refs.popup.open()
			},
		},
	}
</script>

<style scoped lang="scss">
	.table {
		width: 100%;
		font-size: 14px;
		align-items: center;
		padding: 5px 0;
		border-radius: 5px;
		display: flex;
		justify-content: space-between;

		.text {
			color: #8284f0;
			display: flex;

			image {
				width: 22px;
				height: 22px;
				margin-right: 5px;
			}
		}
	}

	.weightPages {
		position: absolute;
		left: 15px;
		right: 15px;
		bottom: 30rpx;
		top: 15px;
		display: flex;
		flex-direction: column;
		justify-content: space-between;

		.weight {
			background: #fff;
			color: #666;
			font-size: 16px;
			flex-wrap: wrap;
			text-align: center;

			view {
				width: 60%;
				height: 100rpx;
				display: flex;
				margin-left: 25%;
				align-items: flex-end;
				margin-bottom: 30rpx;

				text {
					width: 80px;
					display: inline-block;
					border-bottom: 1px solid #dfdfdf;
					margin: 0 20rpx;
					font-size: 18px;
					font-weight: bold;
					color: #f0ae43;
				}
			}
		}



		.tips {
			font-size: 24rpx;
			text-align: center;
		}

		.groupbtn {
			margin-top: 0;
			display: flex;
			align-items: center;
			justify-content: space-between;

			.btn {
				width: 20%;
				color: $maincolor;
				text-align: center;
				height: 40px;
				line-height: 40px;
				border-radius: 10px;
				border: 1px solid $maincolor;
				background: #fff;
				margin: 0;

				view {
					border: none !important;
					width: auto !important;
					height: 40px !important;
					line-height: 40px !important;
				}
			}
		}

		.weight-wrap {
			display: flex;
			justify-content: space-around;
			align-items: center;
			color: #666;
			font-size: 16px;
			text-align: center;
			height: 60px;
			border-radius: 10px;

			.weight {
				display: flex;
				justify-content: center;
				align-items: center;
				width: 48%;
				padding: 30rpx 0;
				border-radius: 20rpx;
				background-color: #F8F8F8;

				.val {
					font-size: 54rpx;
					color: #F0AE43;
					margin: 0 !important;
				}

				.unit {
					padding: 10rpx;
					margin-left: 20rpx;
					font-size: 28rpx;
					color: #fff;
					border-radius: 8rpx;
					background-color: #F0AE43;
				}
			}
		}

		.duan {
			width: fit-content;
			background: linear-gradient(-90deg, #d4f5c4, #a7d5e4 80%, );
			border-radius: 5px;
			text-align: center;
			padding: 3px 10px;
			font-size: 12px;
		}

		.name {
			width: 100%;
			text-align: center;
			font-size: 16px;
			font-weight: bold;
		}
	}
</style>