package com.fuyuanshen.global.mqtt.service.impl;

import com.alibaba.fastjson2.JSON;
import com.fuyuanshen.equipment.domain.Device;
import com.fuyuanshen.equipment.mapper.DeviceMapper;
import com.fuyuanshen.global.mqtt.base.MqttMessage;
import com.fuyuanshen.global.mqtt.base.SensorData;
import com.fuyuanshen.global.mqtt.config.MqttGateway;
import com.fuyuanshen.global.mqtt.service.MqttMessageService;
import com.fuyuanshen.global.mqtt.utils.MqttTopicUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

/**
 * MQTT消息处理服务实现类
 */
@Slf4j
@Service
public class MqttMessageServiceImpl implements MqttMessageService {
    
    private final MqttGateway mqttGateway;
    
    private final DeviceMapper deviceMapper;
    
    public MqttMessageServiceImpl(MqttGateway mqttGateway, DeviceMapper deviceMapper) {
        this.mqttGateway = mqttGateway;
        this.deviceMapper = deviceMapper;
    }
    
    /**
     * 处理下发指令的响应消息
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei 设备IMEI
     * @param message 响应消息
     */
    @Override
    public void handleCommandResponse(String tenantCode, String deviceType, String imei, MqttMessage message) {
        log.info("处理设备响应消息: tenantCode={}, deviceType={}, imei={}, message={}", 
                tenantCode, deviceType, imei, JSON.toJSONString(message));
        
        // 根据requestId更新指令执行状态
        // TODO: 实现具体的业务逻辑，比如更新指令执行结果等
    }
    
    /**
     * 处理设备主动上报的数据
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei 设备IMEI
     * @param message 上报消息
     */
    @Override
    public void handleDeviceReport(String tenantCode, String deviceType, String imei, MqttMessage message) {
        log.info("处理设备上报数据: tenantCode={}, deviceType={}, imei={}, message={}", 
                tenantCode, deviceType, imei, JSON.toJSONString(message));
        
        // 查找设备
        Device device = deviceMapper.selectDeviceByImei(imei);
        if (device == null) {
            log.warn("未找到对应设备: imei={}", imei);
            return;
        }
        
        // 处理批量数据上报
        if (message.getBatch() != null && !message.getBatch().isEmpty()) {
            for (int i = 0; i < message.getBatch().size(); i++) {
                processSensorData(device, message.getBatch().get(i));
            }
        } 
        // 处理单个数据上报
        else if (message.getData() != null) {
            // 如果data是一个SensorData对象，则处理它
            // 这里可以根据实际的数据结构做相应处理
        }
    }
    
    /**
     * 发送指令到设备
     * @param tenantCode 租户编码
     * @param deviceType 设备类型
     * @param imei 设备IMEI
     * @param message 指令消息
     */
    @Override
    public void sendCommand(String tenantCode, String deviceType, String imei, MqttMessage message) {
        // 构建下发指令主题
        String topic = MqttTopicUtils.buildCommandTopic(tenantCode, deviceType, imei);
        
        // 设置时间戳
        if (message.getTimestamp() == null) {
            message.setTimestamp(System.currentTimeMillis());
        }
        
        // 发送消息到MQTT
        String payload = JSON.toJSONString(message);
        mqttGateway.sendMsgToMqtt(topic, 1, payload);
        
        log.info("发送指令到设备: topic={}, payload={}", topic, payload);
    }
    
    /**
     * 处理传感器数据
     * @param device 设备对象
     * @param sensorData 传感器数据
     */
    private void processSensorData(Device device, SensorData sensorData) {
        log.info("处理传感器数据: deviceId={}, sensor={}, value={}", 
                device.getId(), sensorData.getSensor(), sensorData.getValue());
        
        String sensor = sensorData.getSensor();
        Object value = sensorData.getValue();
        
        // 根据不同的传感器类型处理数据
        switch (sensor) {
            case "mainLightMode":
                // 处理主灯模式数据
                updateDeviceMainLightMode(device, value);
                break;
            case "mainLightBrightness":
                // 处理主灯亮度数据
                updateDeviceMainLightBrightness(device, value);
                break;
            case "batteryPercent":
                // 处理电池电量数据
                updateDeviceBatteryPercent(device, value);
                break;
            default:
                log.warn("未知的传感器类型: sensor={}", sensor);
                break;
        }
    }
    
    /**
     * 更新设备主灯模式
     * @param device 设备对象
     * @param value 主灯模式值
     */
    private void updateDeviceMainLightMode(Device device, Object value) {
        // TODO: 实现具体的业务逻辑
        log.info("更新设备主灯模式: deviceId={}, value={}", device.getId(), value);
    }
    
    /**
     * 更新设备主灯亮度
     * @param device 设备对象
     * @param value 主灯亮度值
     */
    private void updateDeviceMainLightBrightness(Device device, Object value) {
        // TODO: 实现具体的业务逻辑
        log.info("更新设备主灯亮度: deviceId={}, value={}", device.getId(), value);
    }
    
    /**
     * 更新设备电池电量
     * @param device 设备对象
     * @param value 电池电量值
     */
    private void updateDeviceBatteryPercent(Device device, Object value) {
        // TODO: 实现具体的业务逻辑
        log.info("更新设备电池电量: deviceId={}, value={}", device.getId(), value);
    }
}