/*
 * 文 件 名:  BaseSendHandler
 * 版    权:  华设设计集团股份有限公司
 * 描    述:  <描述>
 * 修 改 人:  lvwenbin
 * 修改时间:  2025/3/3
 * 跟踪单号:  <跟踪单号>
 * 修改单号:  <修改单号>
 * 修改内容:  <修改内容>
 */
package com.ruoyi.ems.handle;

import com.alibaba.fastjson2.JSONObject;
import com.ruoyi.ems.core.MqttTemplate;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Qualifier;

import javax.annotation.Resource;

/**
 * Mqtt基类
 * <功能详细描述>
 *
 * @author lvwenbin
 * @version [版本号, 2025/3/3]
 * @see [相关类/方法]
 * @since [产品/模块版本]
 */
public abstract class BaseMqttHandler {
    /**
     * 日志服务
     */
    protected static final Logger log = LoggerFactory.getLogger(BaseMqttHandler.class);

    @Resource
    @Qualifier("mqttTemplate")
    protected MqttTemplate mqttTemplate;

    /**
     * 抽象方法，用于消息处理
     *
     * @param deviceCode 设备编码
     * @param payload    负载数据
     * @return 处理结果字符串
     */
    public abstract void msgHandle(String deviceCode, String payload);

    /**
     * 添加消息ID到消息中
     *
     * @param msg 消息
     * @return msgBody
     */
    public String addMsgId(String msg, String msgIdKey, String msgIdValue) {
        JSONObject json = JSONObject.parseObject(msg);
        json.put(msgIdKey, msgIdValue);
        return json.toString();
    }

    /**
     * 发送MQTT消息
     *
     * @param topic    主题
     * @param payload  负载数据
     * @param qos      质量服务等级
     * @param retained 是否保留消息
     */
    public void sendMqttMsg(String topic, String payload, int qos, boolean retained) {
        log.info("[Send] Topic:{}, message:{}, qos:{}, retained:{}", topic, payload, qos, retained);
        mqttTemplate.sendString(topic, payload, 2, false);
    }

    /**
     * 发送MQTT消息
     *
     * @param topic    主题
     * @param payload  负载数据
     * @param qos      质量服务等级
     * @param retained 是否保留消息
     */
    public void sendMqttHex(String topic, String payload, int qos, boolean retained) {
        log.info("[Send] Topic:{}, message:{}, qos:{}, retained:{}", topic, payload, qos, retained);
        mqttTemplate.sendHex(topic, payload, 2, false);
    }
}