import $store from '@/store'
import messages from '@/language/index.js'
let searchTimer = null
let devicesList = []
// 初始化蓝牙

function openBluetoothAdapter() {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.openBluetoothAdapter({
		success: e => {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.SearchBluetooth,
				isConnectStatus: 0
			})
			startBluetoothDeviceDiscovery()
		},
		fail: e => {
			$store.commit("changeBluetoothValue", {
				bleTipsText: $t.ConnectionTimeout,
				isConnectStatus: 1
			})
		}
	});
}
// 开始搜寻附近的蓝牙外围设备
function startBluetoothDeviceDiscovery() {
	let Language = $store.state.setLocale
	let $t = messages[Language]
	uni.startBluetoothDevicesDiscovery({
		allowDuplicatesKey: true,
		services: [],
		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 => {
			device.advertisData = device.advertisData ? device.advertisData : ''
			let value = ab2hex(device.advertisData, "")
			let id = value.substring(0, 4)
			if (!device.name && !device.localName) {
				return
			}
			if (device.name.indexOf('G02') != -1 || (device.localName && device
					.localName.indexOf('G02') != -1) || id == 'a5fe') {
				clearTimeout(searchTimer);
				stopBluetoothDevicesDiscovery()
				Bluetoothfilter(device.deviceId)
				return
			}
		})
	});
}
// 过滤蓝牙
function Bluetoothfilter(device_id) {
	const foundDevices = devicesList
	const idx = inArray(foundDevices, "deviceId", device_id)
	if (idx === -1) {
		devicesList.push(device_id);
		connectDevice(device_id)
	}
}

//连接设备
function connectDevice(device_id) {
	uni.createBLEConnection({
		deviceId: device_id,
		success: res => {
			setTimeout(function() {
				getBLEDeviceServices(device_id)
			}, 200)
		},
		fail: res => {
			console.log("连接失败，点击重新连接", res);
		}
	});
}
/**
 * 获取设备的UUID
 */
function getBLEDeviceServices(device_id) {
	let serviceList = [];
	uni.getBLEDeviceServices({
		deviceId: device_id,
		success: res => {
			console.log("获取设备的UUID成功", res)
			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 => {
			console.log('获取设备的UUID失败:', res)
		}
	});
}

/**
 * 获取指定服务的特征值
 */
function getBLEDeviceCharacteristics(deviceId, serviceId) {
	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 => {
			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",
				countWeight: "",
				bleTipsText: $t.Measuring,
				isConnectStatus: 0
			})
			const units = ['kg', 'g', 'st:lb', 'lb', 'g', 'ml', 'Waterml',
				'milkml', 'oz', 'floz', 'lboz'
			]
			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],
							})
							break

						case 0x03:
							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: '',
			})
			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,
				isConnectStatus: 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
}