package com.gxwebsoft.hjm.service;

import org.eclipse.paho.client.mqttv3.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * GPS消息回调处理器
 *
 * @author 科技小王子
 * @since 2025-07-02
 */
@Component
public class GpsMessageCallback implements MqttCallback {
    
    private static final Logger logger = LoggerFactory.getLogger(GpsMessageCallback.class);
    
    @Resource
    private GpsMessageProcessor gpsMessageProcessor;
    
    @Override
    public void connectionLost(Throwable cause) {
        logger.error("MQTT连接丢失", cause);
        
        // 可以在这里添加告警通知逻辑
        // 例如：发送邮件、短信通知管理员
        notifyConnectionLost(cause);
    }
    
    @Override
    public void messageArrived(String topic, MqttMessage message) throws Exception {
        try {
            String payload = new String(message.getPayload());
            
            logger.debug("接收到MQTT消息 - 主题: {}, QoS: {}, 消息长度: {}", 
                        topic, message.getQos(), payload.length());
            
            // 记录详细的消息内容（仅在DEBUG级别）
            if (logger.isDebugEnabled()) {
                logger.debug("消息内容: {}", payload);
            }
            
            // 委托给专门的处理器处理
            gpsMessageProcessor.processGpsMessage(payload);
            
        } catch (Exception e) {
            logger.error("处理MQTT消息失败 - 主题: {}, 错误: {}", topic, e.getMessage(), e);
            
            // 不要重新抛出异常，避免影响其他消息的处理
            // 可以在这里添加失败消息的重试机制或死信队列
            handleMessageProcessingFailure(topic, message, e);
        }
    }
    
    @Override
    public void deliveryComplete(IMqttDeliveryToken token) {
        logger.debug("MQTT消息发送完成: {}", token.isComplete());
        
        try {
            if (token.getTopics() != null && token.getTopics().length > 0) {
                logger.debug("发送完成的主题: {}", String.join(", ", token.getTopics()));
            }
        } catch (Exception e) {
            logger.warn("获取发送完成的主题信息失败", e);
        }
    }
    
    /**
     * 处理连接丢失的通知
     *
     * @param cause 连接丢失的原因
     */
    private void notifyConnectionLost(Throwable cause) {
        try {
            // 这里可以实现具体的通知逻辑
            // 例如：
            // 1. 发送邮件通知
            // 2. 发送短信通知
            // 3. 写入告警日志
            // 4. 调用监控系统API
            
            logger.warn("MQTT连接丢失通知已触发，原因: {}", cause.getMessage());
            
            // 示例：可以调用告警服务
            // alertService.sendAlert("MQTT连接丢失", cause.getMessage());
            
        } catch (Exception e) {
            logger.error("发送MQTT连接丢失通知失败", e);
        }
    }
    
    /**
     * 处理消息处理失败的情况
     *
     * @param topic   消息主题
     * @param message 消息内容
     * @param error   错误信息
     */
    private void handleMessageProcessingFailure(String topic, MqttMessage message, Exception error) {
        try {
            // 这里可以实现失败消息的处理逻辑
            // 例如：
            // 1. 将失败的消息保存到数据库
            // 2. 发送到死信队列
            // 3. 记录到失败日志文件
            // 4. 实现重试机制
            
            String payload = new String(message.getPayload());
            logger.warn("消息处理失败记录 - 主题: {}, 消息: {}, 错误: {}", 
                       topic, payload.length() > 100 ? payload.substring(0, 100) + "..." : payload, 
                       error.getMessage());
            
            // 示例：可以保存失败消息到数据库
            // failedMessageService.saveFailedMessage(topic, payload, error.getMessage());
            
        } catch (Exception e) {
            logger.error("处理消息失败记录时发生错误", e);
        }
    }
}
