#pragma once

#include <QObject>
#include <QString>
#include <QVariant>
#include <QList>
#include <QStringList>

/**
 * @brief 数据项结构
 * 用于数据传输的基本单元
 */
struct DataItem {
    int ID;
    QVariant value;

    // 添加构造函数
    DataItem(int id = 0, const QVariant& val = QVariant())
        : ID(id), value(val) {}
};


/**
 * @brief 数据点信息结构
 * 描述数据点的详细信息
 */
struct DataPointInfo {
    int ID;            // 数据点编号
    QString name;      // 数据点名称
    QString dataType;  // 数据类型
};

/**
 * @brief DDS插件接口类
 */
class AuseftDDSPluginInterface
{
public:
    // 定义支持的数据类型列表
    static const inline QStringList SupportedTypes = {
        "bool",     // 布尔型
        "int8",     // 8位整型
        "uint8",    // 8位无符号整型
        "int16",    // 16位整型
        "uint16",   // 16位无符号整型
        "int32",    // 32位整型
        "uint32",   // 32位无符号整型
        "int64",    // 64位整型
        "uint64",   // 64位无符号整型
        "float",    // 单精度浮点
        "double",   // 双精度浮点
        "string"    // 字符串
    };

    // 验证数据类型是否支持
    static bool isTypeSupported(const QString& type) {
        return SupportedTypes.contains(type.toLower());
    }

    virtual ~AuseftDDSPluginInterface() {}

    /**
     * @brief 初始化插件
     * @param domainId DDS域ID
     * @param domainName DDS域名称
     * @return 是否初始化成功
     */
    virtual Q_INVOKABLE bool init(uint32_t domainId, const QString& domainName) = 0;

    /**
     * @brief 获取所有支持的数据点信息
     * @return 数据点信息列表
     */
    virtual Q_INVOKABLE QList<DataPointInfo> getDataPoints() = 0;

    /**
     * @brief 发布数据
     * @param dataList 要发布的数据列表
     * @return 是否发布成功
     */
    virtual Q_INVOKABLE bool publishData(const QList<DataItem>& dataList) = 0;

    /**
     * @brief 配置插件
     * @return 是否成功显示配置界面
     */
    virtual Q_INVOKABLE bool config() = 0;

    /**
     * @brief 数据更新回调
     * @param dataList 更新的数据列表
     */
signals:    
    void onDataUpdated(const QList<DataItem>& dataList);
    
    /**
     * @brief 配置变更信号
     * @param config JSON格式的配置字符串
     */
    void onConfigurationChanged(const QString& config);
};

#define AuseftDDSPluginInterface_iid "Com.Auseft.AuseftDDSPluginInterface"
Q_DECLARE_INTERFACE(AuseftDDSPluginInterface, AuseftDDSPluginInterface_iid)
