#ifndef NODEDATA_H
#define NODEDATA_H

#include <QObject>
#include <QDateTime>
#include <QSet>

namespace SpecialNodeID {
enum Value {
    InvalidNodeId = -1,
    RootFolder = 0,
    TrashFolder = 1,
    DefaultNotesFolder = 2,
};
}

// NodeData类用于表示节点数据
class NodeData
{
public:
    explicit NodeData();

    enum Type { Note = 0, Folder };

    // 获取节点ID
    int id() const;
    // 设置节点ID
    void setId(int id);

    // 获取完整标题
    QString fullTitle() const;
    // 设置完整标题
    void setFullTitle(const QString &fullTitle);

    // 获取最后修改时间
    QDateTime lastModificationdateTime() const;
    // 设置最后修改时间
    void setLastModificationDateTime(const QDateTime &lastModificationdateTime);

    // 获取创建时间
    QDateTime creationDateTime() const;
    // 设置创建时间
    void setCreationDateTime(const QDateTime &creationDateTime);

    // 获取内容
    QString content() const;
    // 设置内容
    void setContent(const QString &content);

    // 判断是否被修改
    bool isModified() const;
    // 设置修改状态
    void setModified(bool isModified);

    // 判断是否被选中
    bool isSelected() const;
    // 设置选中状态
    void setSelected(bool isSelected);

    // 获取滚动条位置
    int scrollBarPosition() const;
    // 设置滚动条位置
    void setScrollBarPosition(int scrollBarPosition);

    // 获取删除时间
    QDateTime deletionDateTime() const;
    // 设置删除时间
    void setDeletionDateTime(const QDateTime &deletionDateTime);

    // 获取节点类型
    NodeData::Type nodeType() const;
    // 设置节点类型
    void setNodeType(NodeData::Type newNodeType);

    // 获取父节点ID
    int parentId() const;
    // 设置父节点ID
    void setParentId(int newParentId);

    // 获取相对位置
    int relativePosition() const;
    // 设置相对位置
    void setRelativePosition(int newRelativePosition);

    // 获取绝对路径
    const QString &absolutePath() const;
    // 设置绝对路径
    void setAbsolutePath(const QString &newAbsolutePath);

    // 获取标签ID集合
    const QSet<int> &tagIds() const;
    // 设置标签ID集合
    void setTagIds(const QSet<int> &newTagIds);

    // 判断是否为临时笔记
    bool isTempNote() const;
    // 设置临时笔记状态
    void setIsTempNote(bool newIsTempNote);

    // 获取父节点名称
    const QString &parentName() const;
    // 设置父节点名称
    void setParentName(const QString &newParentName);

    // 判断是否为固定笔记
    bool isPinnedNote() const;
    // 设置固定笔记状态
    void setIsPinnedNote(bool newIsPinnedNote);

    // 获取标签列表滚动条位置
    int tagListScrollBarPos() const;
    // 设置标签列表滚动条位置
    void setTagListScrollBarPos(int newTagListScrollBarPos);

    // 获取相对位置AN
    int relativePosAN() const;
    // 设置相对位置AN
    void setRelativePosAN(int newRelativePosAN);

    // 获取子笔记数量
    int childNotesCount() const;
    // 设置子笔记数量
    void setChildNotesCount(int newChildCount);

private:
    int m_id;
    QString m_fullTitle;
    QDateTime m_lastModificationDateTime;
    QDateTime m_creationDateTime;
    QDateTime m_deletionDateTime;
    QString m_content;
    bool m_isModified;
    bool m_isSelected;
    int m_scrollBarPosition;
    NodeData::Type m_nodeType;
    int m_parentId;
    int m_relativePosition;
    QString m_absolutePath;
    QSet<int> m_tagIds;
    bool m_isTempNote;
    QString m_parentName;
    bool m_isPinnedNote;
    int m_tagListScrollBarPos;
    int m_relativePosAN;
    int m_childNotesCount;
};

// 用于QMetaType的声明
Q_DECLARE_METATYPE(NodeData)

// 重载输入流运算符以读取NodeData对象
QDataStream &operator>>(QDataStream &stream, NodeData &nodeData);
// 重载输入流运算符以读取NodeData指针对象
QDataStream &operator>>(QDataStream &stream, NodeData *&nodeData);

#endif // NODEDATA_H