package com.ruoyi.common.model;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

import java.time.LocalDateTime;
import java.util.Map;

/**
 * MQTT消息模型类
 *
 * <p>封装MQTT消息的各种属性，包括主题、内容、QoS等，
 * 可用于消息发布和接收场景。</p>
 *
 * @author andy
 * @version 1.0.0
 * @since 2025-06-17
 */
@Data
@NoArgsConstructor
@AllArgsConstructor
public class MqttMessage {

    /**
     * 消息主题
     */
    private String topic;

    /**
     * 消息内容
     */
    private String payload;

    /**
     * 服务质量
     * <p>0 - 最多发送一次，不保证送达</p>
     * <p>1 - 至少发送一次，确保送达但可能重复</p>
     * <p>2 - 确保仅送达一次</p>
     */
    private int qos = 1;

    /**
     * 是否为保留消息
     */
    private boolean retained = false;

    /**
     * 消息发送/接收时间
     */
    private LocalDateTime timestamp = LocalDateTime.now();

    /**
     * 消息自定义属性
     */
    private Map<String, Object> properties;

    /**
     * 带主题和内容的构造函数
     *
     * @param topic 消息主题
     * @param payload 消息内容
     */
    public MqttMessage(String topic, String payload) {
        this.topic = topic;
        this.payload = payload;
    }

    /**
     * 带主题、内容、QoS和保留标志的构造函数
     *
     * @param topic 消息主题
     * @param payload 消息内容
     * @param qos 服务质量
     * @param retained 是否保留
     */
    public MqttMessage(String topic, String payload, int qos, boolean retained) {
        this.topic = topic;
        this.payload = payload;
        this.qos = qos;
        this.retained = retained;
    }
}
