<template>
	<view class="container">
		<!-- 设备列表 -->
		<scroll-view class="device-list" scroll-y>
			<view class="device-card" v-for="(item, index) in deviceList" :key="index" @click="item.onlineStatus === 1 ? toggleSelect(index) : null">
				<!-- 复选框 -->
				<view class="checkbox" :class="{ checked: item.checked,disabled: item.onlineStatus !== 1  }">
					<uni-icons v-if="item.checked" type="checkmarkempty" size="18" color="rgb(0, 0, 0)"></uni-icons>
				</view>
				<!-- 设备信息 -->
				<view class="device-content">
					<view class="device-header">
						<view class="deviceIMG">
							<image :src="item.devicePic" class="IMG" mode="aspectFit"></image>
						</view>
						<view class="device-name">
							<view>设备:{{ item.deviceName }}</view>
							<view class="ID">
								<view class="ID">ID:{{ item.deviceImei }}</view>
								<view class="onlines" v-if="item.onlineStatus == 1">在线</view>
								<!-- 离线状态 -->
								<view class="unlines" v-if="item.onlineStatus == 0">离线</view>
								<view>电量：{{ item.battery || '0' }}%</view>
							</view>
						</view>
					</view>
				</view>
			</view>
			<view class="editInfmation">
				<view class="ql-editor">编辑信息</view>
				<view class="ql-input">
					<textarea placeholder-style="color:rgba(255, 255, 255, 0.4)" placeholder="请输入内容" class="textarea"
						v-model="messageToSend" :maxlength="20" />
				</view>
				<button class="login-btn" @click.stop="sendTextMessage">发送</button>
			</view>
		</scroll-view>
		<!-- 成功提示弹框 -->
		<CustomPopup :show="showPopupFlag" :title="popupTitle" :message="popupMessage"
			icon="/static/images/common/sendSucc.png" :confirm-text="popupConfirmText" :show-cancel="false"
			@confirm="onPopupConfirm" />
	</view>
</template>

<script>
	import CustomPopup from '@/components/CustomPopup/CustomPopup.vue'
	import {
		deviceInfo,
	} from '@/api/common/index.js'
	import {
		deviceSendMessage,
		deviceRealTimeStatus //设备状态
	} from '@/api/6170/deviceControl.js'
	import {
		generateShortId
	} from '@/utils/function.js';
	export default {
		components: {
			CustomPopup
		},
		data() {
			return {
				deviceList: [],
				messageToSend: '', //发送信息
				showPopupFlag: false,
				popupTitle: '',
				popupMessage: '信息发送成功！',
				popupConfirmText: '确认',
				isSending: false,
				sendInfo: {}
			}
		},
		methods: {
			onPullDownRefresh() {
				// 执行下拉刷新时的操作，比如重新获取数据
				this.getData();
			},
			/**
			 * 获取设备状态（带自动轮询）
			 * @param {number} val - 功能模式
			 * @param {string} batchId - 批次ID
			 * @param {number} [interval=1000] - 轮询间隔（毫秒）
			 */
			async getdeviceSTatus(val, batchId, interval = 800) {
				let retries = 0;
				const checkStatus = async () => {
					try {
						const data = {
							functionMode: val,
							batchId: batchId,
							typeName: this.sendInfo.typeName,
							deviceImei: this.sendInfo.deviceImei
						};
						const res = await deviceRealTimeStatus(data);
						if (res.code !== 200) {
							throw new Error(res.msg || '请求失败');
						}
						switch (res.data.functionAccess) {
							case 'OK':
								return res; // 成功完成
							case 'ACTIVE':
								await new Promise(r => setTimeout(r, interval));
								return checkStatus(); // 继续轮询
							case 'FAILED':
								throw new Error('设备操作失败');
							case 'TIMEOUT':
								throw new Error('设备响应超时');
							default:
								throw new Error('未知状态');
						}
					} catch (error) {
						throw error;
					}
				};
				return checkStatus();
			},

			toggleSelect(index) {
				this.deviceList[index].checked = !this.deviceList[index].checked
				this.$forceUpdate()
			},
			// 获取设备列表
			getData(deviceType) {
				this.loading = true;
				let data = {
					pageNum: 1,
					pageSize: 50,
					deviceType: deviceType
				}
				deviceInfo(data).then((res) => {
					if (res.code == 200) {
						const newDevices = res.rows.map(device => ({
							...device,
							showConfirm: false,
							checked: false
						}));
						this.total = res.total;
						this.deviceList = newDevices
					}
				}).finally(() => {
					this.loading = false;
				});
			},
			// 发送文本消息
			async sendTextMessage() {
				// 防重复提交
				if (this.isSending) return;
				const selectedDevices = this.deviceList.filter(item => item.checked)
				const deviceIds = selectedDevices.map(item => item.id);
				const deviceImeiList = selectedDevices.map(item => item.deviceImei);
				if (selectedDevices.length === 0) {
					uni.showToast({
						title: '请选择一个设备',
						icon: 'none'
					});
					return;
				}
				if (!this.messageToSend) {
					uni.showToast({
						title: '请输入要发送的文字',
						icon: 'none'
					});
					return;
				}
				this.isSending = true;
				let loadingShown = false;
				try {
					uni.showLoading({
						title: '发送中...',
						mask: true
					});
					loadingShown = true;
					// 2. 准备请求数据
					const batchId = generateShortId();
					const data = {
						sendMsg: this.messageToSend,
						deviceIds: deviceIds,
						batchId: batchId,
						typeName: this.sendInfo.typeName,
						batchId: batchId,
						deviceImeiList: deviceImeiList
					};
					// 3.人员信息
					const registerRes = await deviceSendMessage(data);
					if (registerRes.code !== 200) {
						uni.showToast({
							title: registerRes.msg,
							icon: 'none'
						})
						return
					}
					// 4. 获取设备状态
					const statusRes = await this.getdeviceSTatus(2, batchId);
					if (statusRes.data.functionAccess === 'OK') {
						// 5. 显示成功弹窗
						this.showPopupFlag = true
					}
				} catch (error) {
					uni.showToast({
						title: error.message,
						icon: 'none'
					});
				} finally {
					uni.hideLoading();
					this.isSending = false;
				}
			},
			onPopupConfirm() {
				this.showPopupFlag = false
				uni.navigateBack()
				console.log('用户点击了确定')
				// 处理确认逻辑
			},
		},
		onLoad(options) {
			const eventChannel = this.getOpenerEventChannel();
			// 监听 'deviceSend' 事件，获取传过来的数据
			eventChannel.on('deviceSend', (data) => {
				console.log('Received detail data:', data);
				this.getData(data.data.id)
				this.sendInfo = data.data
			});
			// 如果需要向调用页面返回数据，可以触发 'ack' 事件
			eventChannel.emit('ack', {})
		},
	}
</script>

<style scoped>
	.container {
		min-height: 100vh;
		background-color: rgb(18, 18, 18);
		box-sizing: border-box;
		overflow-x: hidden;

	}

	.device-list {
		flex: 1;
		padding: 0 20rpx;

	}

	.device-card {
		position: relative;
		display: flex;
		align-items: center;
		width: 95%;
		margin-bottom: 20rpx;
	}

	.checkbox {
		width: 40rpx;
		height: 40rpx;
		border: 2rpx solid rgba(255, 255, 255, 0.5);
		margin-right: 20rpx;
		border-radius: 4rpx;
		display: flex;
		align-items: center;
		justify-content: center;
	}

	.checkbox.checked {
		background-color: rgb(187, 230, 0);
		border-color: rgb(187, 230, 0);
	}

	.device-content {
		background-color: rgb(26, 26, 26);
		border-radius: 16rpx;
		position: relative;
		/* display: flex; */
		align-items: center;
		padding: 20rpx;
		width: 95%;
	}

	.device-header {
		display: flex;
		align-items: center;
		margin-bottom: 15rpx;
	}

	.device-name {
		font-size: 32rpx;
		color: rgba(255, 255, 255, 0.87);
		margin-left: 12rpx;
		line-height: 50rpx;
		width: 83%;
		white-space: nowrap;
	}

	.ID {
		color: rgba(255, 255, 255, 0.6);
		font-size: 26rpx;
		display: flex;
		justify-content: space-between;
		position: relative;
	}

	.device-status {
		width: 122rpx;
		height: 52rpx;
		font-size: 26rpx;
		border-radius: 0px 8px 0px 8px;
		background-color: rgb(42, 42, 42);
		position: absolute;
		top: 0rpx;
		right: 0rpx;
		text-align: center;
		line-height: 52rpx;
	}

	.online {
		color: rgb(187, 230, 0);
	}

	.unline {
		color: rgba(255, 255, 255, 0.4);
	}

	.device-info {
		display: flex;
		justify-content: space-evenly;
		font-size: 26rpx;
		color: rgba(255, 255, 255, 0.87);
		padding-top: 10rpx;
		position: relative;
	}

	.deviceIMG {
		width: 100rpx;
		height: 100rpx;
		border-radius: 16rpx;
		position: relative;
		background-color: rgba(42, 42, 42, 0.6);
		display: flex;
		align-items: center;
	}

	.IMG {
		width: 68rpx;
		height: 50rpx;
		margin-left: 17%;
	}

	.onlines {
		position: relative;
	}

	.onlines::before {
		content: '';
		position: absolute;
		width: 15rpx;
		height: 15rpx;
		background: rgb(0, 171, 103);
		border-radius: 50%;
		top: 20rpx;
		left: -20rpx
	}

	.unlines {
		position: relative;
	}

	.unlines::before {
		content: '';
		position: absolute;
		width: 15rpx;
		height: 15rpx;
		background: rgba(255, 255, 255, 0.4);
		border-radius: 50%;
		top: 20rpx;
		left: -20rpx
	}

	.line {
		width: 2rpx;
		height: 24rpx;
		background: linear-gradient(90deg,
				rgba(0, 0, 0, 0) 0%,
				rgb(255, 255, 255) 50%,
				rgba(255, 255, 255, 0) 100%);
		margin-top: 12rpx;
	}

	.ql-editor {
		color: rgba(255, 255, 255, 0.6);
		font-size: 30rpx;
	}

	.ql-input {
		width: 95.9%;
		height: 200rpx;
		margin-top: 30rpx;
		box-sizing: border-box;
		padding: 30rpx;
		border-radius: 16rpx;
		background: rgb(26, 26, 26);
	}

	.textarea {
		color: rgba(255, 255, 255, 0.8);
		background: rgba(42, 42, 42, 1);
		border-radius: 16rpx;
		padding: 10rpx;
		height: 150rpx;
	}

	.editInfmation {
		padding: 20rpx;
		border-radius: 40rpx 40rpx 0px 0px;
		background: rgba(28, 28, 28, 1);
		position: fixed;
		bottom: 50rpx;
		box-sizing: border-box;
	}

	.login-btn {
		margin-top: 30rpx;
		background-color: rgb(187, 230, 0);
		color: rgb(35, 35, 35);
		border-radius: 50rpx;
		width: 90%;
	}
	.checkbox.disabled {
	  opacity: 0.5;
	  background-color: rgba(255, 255, 255, 0.1) !important;
	  border-color: rgba(255, 255, 255, 0.2) !important;
	  pointer-events: none; /* 阻止点击事件 */
	}
	/* 可选：离线设备的卡片整体置灰 */
	.device-card[data-offline="true"] {
	  opacity: 0.6;
	}
</style>