#pragma once

#include <QJsonObject>
#include <QJsonArray>
#include <QVector>
#include <QString>
#include <QHash>

// 轻量级设备树模型：从 daemon_config.json 的 device_tree 字段加载

struct DeviceTreeNode
{
    QString     id;
    QString     name;
    QString     type;
    QString     endpoint;
    QString     driver;
    QString     capabilitiesRef;
    QJsonObject params;
    QVector<QString> childrenIds;
    bool        enabled{true};
};

class DeviceTreeModel
{
public:
    // 从给定的 JSON 根对象（包含 device_tree 字段）加载
    bool loadFromDaemonConfig(const QJsonObject& root, QString* errorMessage = nullptr);

    const QVector<DeviceTreeNode>& nodes() const { return m_nodes; }
    QVector<DeviceTreeNode>& nodesMutable() { return m_nodes; }

    const DeviceTreeNode* findById(const QString& id) const;
    int findIndexById(const QString& id) const;
    int findIndexByEndpoint(const QString& endpoint) const;
    int findIndexByStableKey(const QString& stableKey) const;

    // Monitor/register path: upsert or mark online/offline
    QString upsertNodeByStableKey(const QString& stableKey,
                                  const QString& preferredId,
                                  const QString& type,
                                  const QString& endpoint,
                                  const QString& name,
                                  const QJsonObject& extraParams,
                                  bool online,
                                  const QString& lastSeenTs);
    bool markOfflineByStableKey(const QString& stableKey, const QString& lastSeenTs);

    // 序列化为 daemon_config.json 所需格式
    QJsonArray toDeviceTreeJson() const;
    QJsonObject toDaemonConfigRoot() const;

    // 当外部直接修改 nodesMutable() 后，需要重建索引
    void rebuildIndex();

private:
    QVector<DeviceTreeNode> m_nodes;
    QHash<QString, int>     m_indexById;
};

