package com.ruoyi.mqtt.util;

import com.ruoyi.mqtt.config.MqttConfig;
import com.ruoyi.mqtt.constant.MqttTopicConstants;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

import javax.annotation.PostConstruct;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * MQTT主题工具类
 * 支持从配置文件动态读取ProductID
 */
@Component
public class MqttTopicUtil {
    
    /**
     * 主题解析正则: /${ProductID}/${DeviceID}/${ShortTopic}
     */
    private static final Pattern TOPIC_PATTERN = Pattern.compile("^/([^/]+)/([^/]+)(/.*)?$");
    
    @Autowired
    private MqttConfig mqttConfig;
    
    private static MqttTopicUtil instance;
    
    @PostConstruct
    public void init() {
        instance = this;
    }
    
    /**
     * 获取配置的ProductID
     * @return ProductID
     */
    public static String getProductId() {
        return instance != null ? instance.mqttConfig.getProductId() : "robot4inspection";
    }
    
    /**
     * 获取配置的DeviceID
     * @return DeviceID
     */
    public static String getDeviceId() {
        return instance != null ? instance.mqttConfig.getDeviceId() : "ld000001";
    }
    
    /**
     * 获取完整主题前缀（productId + deviceId）
     * @return 主题前缀: /${ProductID}/${DeviceID}
     */
    public static String getPrefix() {
        return MqttTopicConstants.buildPrefix(getProductId(), getDeviceId());
    }
    
    /**
     * 构建完整主题
     * @param shortTopic 短主题名
     * @return 完整主题: /${ProductID}/${DeviceID}/${ShortTopic}
     */
    public static String buildTopic(String shortTopic) {
        return MqttTopicConstants.buildTopic(getPrefix(), shortTopic);
    }
    
    /**
     * 构建完整主题（保留兼容性，带deviceId参数但会被忽略）
     * @param deviceId 设备ID（已被废弃，使用配置中的deviceId）
     * @param shortTopic 短主题名
     * @return 完整主题
     */
    public static String buildTopic(String deviceId, String shortTopic) {
        return buildTopic(shortTopic);
    }
    
    /**
     * 构建通配符订阅主题(订阅所有设备)
     * @param shortTopic 短主题名
     * @return 通配符主题: /${ProductID}/+/${ShortTopic}
     */
 /*   public static String buildWildcardTopic(String shortTopic) {
        return MqttTopicConstants.buildWildcardTopic(getProductId(), shortTopic);
    }*/
    
    /**
     * 从完整主题中提取设备ID
     * @param fullTopic 完整主题
     * @return 设备ID,解析失败返回null
     */
    public static String extractDeviceId(String fullTopic) {
        Matcher matcher = TOPIC_PATTERN.matcher(fullTopic);
        if (matcher.matches()) {
            return matcher.group(2);
        }
        return null;
    }
    
    /**
     * 从完整主题中提取产品ID
     * @param fullTopic 完整主题
     * @return 产品ID,解析失败返回null
     */
    public static String extractProductId(String fullTopic) {
        Matcher matcher = TOPIC_PATTERN.matcher(fullTopic);
        if (matcher.matches()) {
            return matcher.group(1);
        }
        return null;
    }
    
    /**
     * 从完整主题中提取短主题名
     * @param fullTopic 完整主题
     * @return 短主题名,解析失败返回null
     */
    public static String extractShortTopic(String fullTopic) {
        Matcher matcher = TOPIC_PATTERN.matcher(fullTopic);
        if (matcher.matches()) {
            return matcher.group(3);
        }
        return null;
    }
    
    /**
     * 验证主题是否符合LD导航系统规范
     * @param fullTopic 完整主题
     * @return true:符合规范, false:不符合
     */
    public static boolean isValidTopic(String fullTopic) {
        Matcher matcher = TOPIC_PATTERN.matcher(fullTopic);
        if (!matcher.matches()) {
            return false;
        }
        String productId = matcher.group(1);
        return getProductId().equals(productId);
    }
}
