package org.dromara.app.mqtt;

import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.regex.Matcher;

/**
 * MQTT 上行消息分发器（策略模式）。
 * <p>
 * 启动时自动收集所有 {@link MqttTopicHandler} Bean，按 Topic 正则匹配分发。
 * 新增 Topic 只需新增 Handler 实现类，零改动此处。
 */
@Slf4j
@Component
public class MqttMessageDispatcher {

    private final List<MqttTopicHandler> handlers;

    public MqttMessageDispatcher(List<MqttTopicHandler> handlers) {
        this.handlers = handlers;
        log.info("[MQTT] 消息分发器初始化完成，处理器数量={}", handlers.size());
        for (MqttTopicHandler handler : handlers) {
            log.info("[MQTT] 已注册处理器：{} -> {}", handler.getClass().getSimpleName(), handler.topicPattern());
        }
    }

    /**
     * 分发消息到匹配的处理器。
     *
     * @param topic   MQTT Topic
     * @param payload 消息体
     */
    public void dispatch(String topic, String payload) {
        dispatch(topic, payload, false);
    }

    public void dispatch(String topic, String payload, boolean retained) {
        log.debug("[MQTT] 收到消息 主题={} 消息体={}", topic, payload);

        for (MqttTopicHandler handler : handlers) {
            Matcher matcher = handler.topicPattern().matcher(topic);
            if (matcher.matches()) {
                String deviceIdentity = matcher.group(1);
                handler.handle(deviceIdentity, payload, retained);
                return;
            }
        }

        log.warn("[MQTT] 未找到匹配的处理器 主题={} 消息体={}", topic, payload);
    }
}
