import $store from '@/store'
import $model from '@/tools/model.js'
import $tools from '@/tools/tools.js'
import $data from '@/content.json'
import messages from '@/language/index.js'
let devicesList = []
let searchTimer = null
let UNIT_MAP = $data.units
// 初始化蓝牙

function openBluetoothAdapter() {
	devicesList = []
	let Language = $store.state.setLocale
	let $t = messages[Language]
	clearTimeout(searchTimer);
	uni.openBluetoothAdapter({
		success: e => {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.SearchBluetooth,
				isConnectStatus: 0,
				unitList: $data.unitMinus,
			})
			startBluetoothDeviceDiscovery()
		},
		fail: e => {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.ConnectionTimeout,
				isConnectStatus: 1,
				unitList: $data.unitMinus,
			})
		}
	});
}
// 开始搜寻附近的蓝牙外围设备
function startBluetoothDeviceDiscovery() {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.startBluetoothDevicesDiscovery({
		allowDuplicatesKey: true,
		interval: 200,
		success: res => {
			onBluetoothDeviceFound();
			searchTimer = setTimeout(() => {
				uni.stopBluetoothDevicesDiscovery()
				if (!devicesList.length) {
					clearTimeout(searchTimer);
					$store.commit("changeBluetoothValue", {
						bleTipsText: $t.ConnectionTimeout,
						isConnectStatus: 1
					});
				}
			}, 30000); // 30秒超时
		},
		fail: res => {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.ConnectionTimeout,
				isConnectStatus: 1
			})
		}
	});
}
/**
 * 发现外围设备
 */
function onBluetoothDeviceFound() {
	uni.onBluetoothDeviceFound(res => {
		res.devices.forEach(device => {
			console.log("name", device.name)
			if (!device.name && !device.localName) {
				return
			}
			if (device.name.toLowerCase().indexOf('pc-c06pro') != -1 ||
				device.name.toLowerCase().indexOf('pc-c02pro') != -1 ||
				device.name.toLowerCase().indexOf('pc-c09pro') != -1 ||
				device.name.toLowerCase().indexOf('pc-c10pro') != -1 ||
				device.name.toLowerCase().indexOf('pc-c07pro') != -1 ||
				(device.localName && device.localName.toLowerCase().indexOf('pc-c07pro') != -1) ||
				(device.localName && device.localName.toLowerCase().indexOf('pc-c10pro') != -1) ||
				(device.localName && device.localName.toLowerCase().indexOf('pc-c06pro') != -1) ||
				(device.localName && device.localName.toLowerCase().indexOf('pc-c02pro') != -1) ||
				(device.localName && device.localName.toLowerCase().indexOf('pc-c09pro') != -1)) {
				clearTimeout(searchTimer);
				const bytes = new Uint8Array(device.advertisData);
				const macBytes = bytes.slice(6, 12);
				device.macAddr = $tools.ab2hex(macBytes, ':').toUpperCase()
				stopBluetoothDevicesDiscovery()
				Bluetoothfilter(device)
				return
			}
		})
	});
}
// 过滤蓝牙
function Bluetoothfilter(device) {
	const foundDevices = devicesList
	const idx = inArray(foundDevices, "deviceId", device.deviceId)
	if (idx === -1) {
		devicesList.push(device);
		handleDevType(device)
	}
}
// 排查设备
function handleDevType(device) {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	$model.getCheckDevice({
		mac: device.macAddr,
	}).then(res => {
		console.log("排查设备：", device, res)
		if (res.code == 0) {
			connectDevice(device.deviceId)
		} else {
			devicesList = []
			$tools.msg(res.msg)
			$store.commit("changeBluetoothValue", {
				type: 1,
				isConnectStatus: 1,
				bleTipsText: $t.ConnectionTimeout,
			})
		}
	})
}

//连接设备
function connectDevice(device_id) {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.createBLEConnection({
		deviceId: device_id,
		success: res => {
			setTimeout(function() {
				getBLEDeviceServices(device_id)
			}, 200)
		},
		fail: res => {
			$store.commit("changeBluetoothValue", {
				type: 1,
				isConnectStatus: 1,
				bleTipsText: $t.ConnectionTimeout,
			})
			console.log("连接失败，点击重新连接", res);
		}
	});
}
/**
 * 获取设备的UUID
 */
function getBLEDeviceServices(device_id) {
	let serviceList = [];
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.getBLEDeviceServices({
		deviceId: device_id,
		success: res => {
			console.log("获取设备的UUID成功", res)
			stopBluetoothDevicesDiscovery()
			serviceList = res.services;
			for (let i = 0; i < serviceList.length; i++) {
				let service = serviceList[i];
				if (service.uuid.indexOf("FFF0") != -1) {
					getBLEDeviceCharacteristics(device_id, service.uuid);
					break;
				}
			}
		},
		fail: res => {
			$store.commit("changeBluetoothValue", {
				type: 1,
				isConnectStatus: 1,
				bleTipsText: $t.ConnectionTimeout,
			})
			console.log('获取设备的UUID失败:', res)
		}
	});
}

/**
 * 获取指定服务的特征值
 */
function getBLEDeviceCharacteristics(deviceId, serviceId) {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	let characteristicsList = [];
	uni.getBLEDeviceCharacteristics({
		deviceId: deviceId,
		serviceId: serviceId,
		success: res => {
			let write, notify
			for (let i = 0; i < res.characteristics.length; i++) {
				let item = res.characteristics[i];
				if (item.uuid.indexOf('0000FFF2') != -1) {
					write = item.uuid
				} else if (item.uuid.indexOf('0000FFF1') != -1) {
					notify = item.uuid
				}
			}
			getBLECharacteristicValueChange(deviceId, serviceId, notify, write)
		},
		fail: res => {
			$store.commit("changeBluetoothValue", {
				type: 1,
				isConnectStatus: 1,
				bleTipsText: $t.ConnectionTimeout,
			})
			console.log('获取特征值失败:', JSON.stringify(res))
		}
	})
}

function getBLECharacteristicValueChange(deviceId, serviceId, notify, write) {
	let that = this
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.notifyBLECharacteristicValueChange({
		deviceId: deviceId,
		serviceId: serviceId,
		characteristicId: notify,
		state: true,
		success: () => {
			$store.commit('changeBluetoothValue', {
				deviceId: deviceId,
				serviceId: serviceId,
				notify: notify,
				write: write,
				unit: "g",
				type: 1,
				countWeight: 0,
				oldCountWeight: 0,
				bleTipsText: $t.Measuring,
				isConnectStatus: 2
			})
			uni.onBLECharacteristicValueChange(function(res) {
				const value = res.value
				const dataView = new DataView(value)
				const header = dataView.getUint8(0)
				// MCU主动上报数据
				if (header === 0xC7) {
					const cmd = dataView.getUint8(2)

					switch (cmd) {
						case 0x02:
							const statusByte = dataView.getUint8(4)
							const isNegative = !!(statusByte & 0x80) // 最高位表示正负
							const statusType = statusByte & 0x0F // 状态类型

							// 组合24位重量值 (大端序)
							const weightValue =
								(dataView.getUint8(5) << 16) |
								(dataView.getUint8(6) << 8) |
								dataView.getUint8(7)

							// 精度和单位
							const unitByte = dataView.getUint8(8)
							const precision = (unitByte & 0xF0) >> 4 // 高4位精度
							const unitIndex = unitByte & 0x0F // 低4位单位

							// 计算实际重量
							let finalWeight = weightValue / Math.pow(10, precision)
							if (isNegative) finalWeight = -finalWeight
							$store.commit("changeBluetoothValue", {
								countWeight: finalWeight,
								unit: units[unitIndex],
								type: statusType
							})
							break

						case 0x03:
							break
						case 0x08:
							const start0 = []
							const value2 = $tools.ab2hex(res.value, "");
							const start = parseUnitMask(value2.substring(8, 10), UNIT_MAP.slice(0,7))
							const start1 = parseUnitMask(value2.substring(10, 12), UNIT_MAP.slice(8,10))
							start.push.apply(start, start1)
							if (start.length) {
								$data.unitMinus.forEach(item => {
									start.forEach(item2 => {
										if (item.unit == item2) {
											start0.push(item)
										}
									})

								})
							}
							$store.commit("changeBluetoothValue", {
								unitList: start0.length ? start0 : $data.unitMinus
							})
							console.log("2222222", start, start0)
							break
					}
				}
			})
		},
		fail: res => {
			console.log('获取特征值失败:', JSON.stringify(res))
		}
	})
}

function inArray(arr, key, val) {
	if (!arr || !arr.length || typeof arr != 'object' || !Array.isArray(arr)) {
		return -1
	}
	for (let i = 0; i < arr.length; i++) {
		if (!key) {
			if (arr[i] == val) {
				return i
			}
		} else if (arr[i][key] === val) {
			return i
		}
	}
	return -1;
}

function ab2hex(buffer, split) {
	var hexArr = Array.prototype.map.call(
		new Uint8Array(buffer),
		function(bit) {
			return ('00' + bit.toString(16)).slice(-2)
		}
	)
	return hexArr.join(split);
}
/**
 * 断开蓝牙模块
 */
function closeBluetoothAdapter() {
	uni.closeBluetoothAdapter({
		success: res => {
			$store.commit("changeBluetoothValue", {
				deviceId: "",
				serviceId: "",
				notify: "",
				write: "",
				unit: "g",
				countWeight: 0,
				oldCountWeight: 0,
				type: 1,
				unitList: $data.unitMinus,
				isConnectStatus: 1,
				bleTipsText: $t.ConnectionTimeout,
			})
			console.log('蓝牙模块关闭成功');
		}
	})
}
/**
 * 断开蓝牙连接
 */
function closeBLEConnection(deviceId) {
	uni.closeBLEConnection({
		deviceId: deviceId,
		success: res => {
			console.log('断开蓝牙连接成功');
		}
	});
}
// 监听蓝牙连接状态
function onBLEConnectionStateChange() {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.onBLEConnectionStateChange(function(res) {
		console.log("监听蓝牙连接状态", res.connected)
		if (!res.connected) {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.ConnectionTimeout,
				unitList: $data.unitMinus,
				isConnectStatus: 1,
				type: 1,
			})
			closeBLEConnection()
			closeBluetoothAdapter()
		}
		$store.commit("changeBluetooth", res.connected);
	})
}
/**
 * 停止搜索蓝牙设备
 */
function stopBluetoothDevicesDiscovery() {
	uni.stopBluetoothDevicesDiscovery({
		success: e => {
			console.log("停止搜索蓝牙设备", e)
		},
	});
}
export default {
	ab2hex,
	inArray,
	openBluetoothAdapter,
	startBluetoothDeviceDiscovery,
	onBluetoothDeviceFound,
	Bluetoothfilter,
	connectDevice,
	getBLEDeviceServices,
	getBLEDeviceCharacteristics,
	closeBluetoothAdapter,
	closeBLEConnection,
	getBLECharacteristicValueChange,
	onBLEConnectionStateChange,
	stopBluetoothDevicesDiscovery
}