package com.agri.framework.web.dispatcher;

import com.agri.common.utils.wechat.WxUtil;
import com.agri.framework.interceptor.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;

import javax.annotation.Resource;

/**
 * MQTT消息分发器
 * 核心功能：根据Topic类型路由消息到对应处理器
 * 适配JDK 8，无心跳包相关逻辑
 */
@Component
public class MqttMessageDispatcher {
    /**
     * 优化：统一使用SLF4J日志（JDK 8兼容）
     */
    private static final Logger log = LoggerFactory.getLogger(MqttMessageDispatcher.class);

    /**
     * 设备状态处理器
     */
    @Resource
    private DeviceStatusHandler deviceStatusHandler;

    /**
     * 前端控制指令处理器
     */
    @Resource
    private FrontendControlHandler frontendControlHandler;

    /**
     * 前端在线心跳处理器
     */
    @Resource
    private FrontendOnlineHandler frontendOnlineHandler;

    @Autowired
    private Environment env;

    /**
     * 前端在线心跳处理器
     */
    @Resource
    private FrontendConfigHandler frontendConfigHandler;

    /**
     * 消息分发处理：根据主题类型路由到不同处理方法
     * 可以监听到设备传过来的业务数据  以及前端传过来的控制设备指令
     *
     * @param topic   消息主题
     * @param payload 消息内容（JSON字符串）
     */
    public void handleMessage(String topic, String payload) {
        try {
            // log.info("【MQTT接收】topic={}, payload={}", topic, payload);
            if (env.acceptsProfiles("dev")) return;
            // 设备状态主题：dtu/{deviceId}/up
            if (topic.matches("dtu/\\w+/\\w+")) {
                deviceStatusHandler.handle(topic, payload);
            }
            // 处理前端控制指令主题：frontend/{clientId}/control/{deviceId}
            else if (topic.matches("frontend/\\w+/control/\\w+")) {
                frontendControlHandler.handle(topic, payload);
            }
            // 新增：前端在线心跳主题：frontend/{clientId}/online
            else if (topic.matches("frontend/\\w+/online")) {
                frontendOnlineHandler.handle(topic, payload);
            } // 新增：前端在线心跳主题：frontend/{clientId}/online
            else if (topic.matches("frontend/\\w+/\\w+/config")) {
                frontendConfigHandler.handle(topic, payload);
            }
        } catch (Exception e) {
            WxUtil.pushText("【MQTT消息处理异常】\n  topic: "+ topic+"\n  cause: "+e);
            log.error("【MQTT消息处理异常】topic={}", topic, e);
        }
    }
}
