#ifndef MQTTBase_H
#define MQTTBase_H

#include <QObject>
#include <QMap>

#include "qmqtt.h"
#include "spdlog/spdlog.h"


/**
 * 使用说明:
 *      1. 子类可以继承这个类,重新实现 recvMessage 函数,这个函数是接收到消息的回调函数
 *      2. 使用SPDLOG日志库,需要注册一个名为“MQTT”的logger
 */



class MQTTBase : public QObject
{
    Q_OBJECT
public:
    MQTTBase(QObject* parent = nullptr);

    /* 设置地址 */
    void setIPAndPort(const QString& IP, int port = 1883);
    /* 设置订阅 */
    void addSubcribe(const QString& topic,int qos = 0);
    /* 连接到服务器 */
    void connectToServer();
    /* 发送消息 */
    void sendMessage(const QString& topic, const QByteArray& message, int qos = 0);
    
signals:
    /* 接收到消息,对消息进行了转发 */
    void signal_recvMessage(const QString& message);

protected:
    /* 接收到消息,子类继承这个解析消息数据 */
    virtual void recvMessage(const QMQTT::Message& message) = 0;

protected slots:
    void do_connected();                            /* 连接成功 */
    void do_disconnect();                           /* 断开连接 */
    void do_error(const QMQTT::ClientError error);  /* 错误 */
    void do_subscribed(const QString& topic, const quint8 qos);     /* 订阅成功 */

    void do_received(const QMQTT::Message& message);/* 接收到消息,子类继承这个解析消息数据 */


protected:
    std::shared_ptr<spdlog::logger> m_logger = nullptr;
    bool m_isConnected = false;                     /* 是否连接成功 */
    QString m_mqttIP;                               /* MQTT服务器IP */
    int m_mqttPort;                                 /* MQTT服务器端口 */

    QMap<QString, int> m_mapTopic;                  /* 订阅的主题和QOS */
    QMQTT::Client m_client;                         /* MQTT客户端 */
};


#endif /* MQTTBase_H */