package com.fuyuanshen.global.mqtt.rule;

import com.fuyuanshen.common.core.constant.GlobalConstants;
import com.fuyuanshen.common.json.utils.JsonUtils;
import com.fuyuanshen.common.redis.utils.RedisUtils;
import com.fuyuanshen.global.mqtt.base.MqttMessageRule;
import com.fuyuanshen.global.mqtt.base.MqttRuleContext;
import com.fuyuanshen.global.mqtt.config.MqttGateway;
import com.fuyuanshen.global.mqtt.constants.DeviceRedisKeyConstants;
import com.fuyuanshen.global.mqtt.constants.LightingCommandTypeConstants;
import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.time.Duration;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.CompletableFuture;

/**
 * 主动上报设备数据命令处理
 * "第1位为12表示设备主动上报设备硬件状态，第2为表示当时设备主灯档位，第3位表示当时激光灯档位，第4位电量百分比，第5位为充电状态（0没有充电，1正在充电，2为已充满）
 * 第6位200代表电池剩余续航时间200分钟"
 */
@Component
@RequiredArgsConstructor
@Slf4j
public class ActiveReportingDeviceDataRule implements MqttMessageRule {
    
    private final MqttGateway mqttGateway;


    @Override
    public String getCommandType() {
        return LightingCommandTypeConstants.ACTIVE_REPORTING_DEVICE_DATA;
    }

    @Override
    public void execute(MqttRuleContext context) {
        try {
            Object[] convertArr = context.getConvertArr();
            // Latitude, longitude
            //主灯档位,激光灯档位,电量百分比,充电状态,电池剩余续航时间
            String mainLightMode = convertArr[1].toString();
            String laserLightMode = convertArr[2].toString();
            String batteryPercentage = convertArr[3].toString();
            String chargeState = convertArr[4].toString();
            String batteryRemainingTime = convertArr[5].toString();

            // 异步发送设备状态和位置信息到Redis
            asyncSendDeviceDataToRedisWithFuture(context.getDeviceImei(), mainLightMode, laserLightMode,
                    batteryPercentage, chargeState, batteryRemainingTime);
        } catch (Exception e) {
            log.error("处理定位数据命令时出错", e);
        }
    }

    /**
     * 异步发送设备状态信息和位置信息到Redis（使用CompletableFuture）
     *
     * @param deviceImei 设备IMEI
     * @param mainLightMode 主灯档位
     * @param laserLightMode 激光灯档位
     * @param batteryPercentage 电量百分比
     * @param chargeState 充电状态
     * @param batteryRemainingTime 电池剩余续航时间
     */
    public void asyncSendDeviceDataToRedisWithFuture(String deviceImei, String mainLightMode, String laserLightMode,
                                                     String batteryPercentage, String chargeState, String batteryRemainingTime) {
        CompletableFuture.runAsync(() -> {
            try {
                // 构造设备状态信息对象
                Map<String, Object> deviceInfo = new LinkedHashMap<>();
                deviceInfo.put("deviceImei", deviceImei);
                deviceInfo.put("mainLightMode", mainLightMode);
                deviceInfo.put("laserLightMode", laserLightMode);
                deviceInfo.put("batteryPercentage", batteryPercentage);
                deviceInfo.put("chargeState", chargeState);
                deviceInfo.put("batteryRemainingTime", batteryRemainingTime);
                deviceInfo.put("timestamp", System.currentTimeMillis());

                // 将设备状态信息存储到Redis中
                String deviceRedisKey = GlobalConstants.GLOBAL_REDIS_KEY+DeviceRedisKeyConstants.DEVICE_STATUS_KEY_PREFIX + deviceImei;
                String deviceInfoJson = JsonUtils.toJsonString(deviceInfo);

                // 存储到Redis，设置过期时间（例如24小时）
                RedisUtils.setCacheObject(deviceRedisKey, deviceInfoJson);

                log.info("设备状态信息已异步发送到Redis: device={}, mainLightMode={}, laserLightMode={}, batteryPercentage={}",
                        deviceImei, mainLightMode, laserLightMode, batteryPercentage);
            } catch (Exception e) {
                log.error("异步发送设备信息到Redis时出错: device={}, error={}", deviceImei, e.getMessage(), e);
            }
        });
    }



}
