#ifndef SETTINGCONFIG_H
#define SETTINGCONFIG_H

#include <QVariant>
#include <QSettings>
#include <QApplication>

class SettingConfig : public QObject
{
public:
    ~SettingConfig() {}
    SettingConfig(const SettingConfig&)=delete;
    SettingConfig& operator=(const SettingConfig&)=delete;

    static SettingConfig& getInstance() {
        static SettingConfig instance;
        return instance;
    }

    /**
     * @brief get
     * @param nodeName
     * @param keyName
     * @return QVariant
     * @title
     */
    QVariant getProperty(QString nodeName, QString keyName);
    QVariant getProperty(QString nodeName, QString keyName, QString defaultValue);
    void setProperty(QString nodeName, QString keyName, QString value);
    void init();

    /******** 以下为需要的各类参数 ********/
    // 波特率
    qint32 BAUD_RATE;

    // 屏幕尺寸
    qint16 WINDOW_WIDTH;
    qint16 WINDOW_HEIGHT;

    // 是否需要kafka相关功能
    qint8 NEED_KAFKA;
    // 是否需要SASL加密
    qint8 NEED_SASL;
    // SASL加密用户名和密码
    QString SASL_USERNAME;
    QString SASL_PASSWORD;

    // kafka服务节点
    QString KAFKA_BROKERS;
    // 发送: 钟差数据传输消息队列
    QString KAFKA_DATA_TOPIC;
    // 发送: 计数器工作状态消息队列
    QString KAFKA_STATUS_TOPIC;
    // 监听: 设备和通道配置信息消息队列
    QString KAFKA_MSG_TOPIC;
    // 监听: 报警信息消息队列
    QString KAFKA_ALARM_TOPIC;

    //
    QString CLIENT_ID;
    QString APP_KEY;
    // 设备类型
    QString DEV_TYPES;
    // 所属子系统
    QString SYSTEM;
    // 工作模式  模拟数据或真实工作
    QString WORK_TYPE;
    // 主备软件标识
    qint8 MASTER;
    QString MASTER_HOST;
    quint16 MASTER_PORT;
    // 显示计数器数量
    qint8 DISPLAY_COUNT;
    // 服务监听端口号
    quint16 SERVER_PORT;

    // 设备报警类型
    QStringList DEVICE_ALARM_CODES;
    // 通道报警类型
    QStringList CHANNEL_ALARM_CODES;

    // 样式表硬编码
    QStringList HARD_CODE_QSS;

    QString BASE_URL;

    QString BASE_LOG_PATH;

private:
    SettingConfig();

    QString filename;
    QSettings * setting;
};

#endif // SETTINGCONFIG_H
