#include "nodedata.h"
#include <QDataStream>

// NodeData 类的构造函数，初始化成员变量
NodeData::NodeData()
    : m_id{ SpecialNodeID::InvalidNodeId },
      m_isModified(false),
      m_isSelected(false),
      m_scrollBarPosition(0),
      m_isTempNote{ false },
      m_isPinnedNote{ false },
      m_tagListScrollBarPos{ 0 },
      m_relativePosAN{ 0 },
      m_childNotesCount{ 0 }
{
}

// 获取节点ID
int NodeData::id() const
{
    return m_id;
}

// 设置节点ID
void NodeData::setId(int id)
{
    m_id = id;
}

// 获取节点的完整标题
QString NodeData::fullTitle() const
{
    return m_fullTitle;
}

// 设置节点的完整标题
void NodeData::setFullTitle(const QString &fullTitle)
{
    m_fullTitle = fullTitle;
}

// 获取最后修改时间
QDateTime NodeData::lastModificationdateTime() const
{
    return m_lastModificationDateTime;
}

// 设置最后修改时间
void NodeData::setLastModificationDateTime(const QDateTime &lastModificationdateTime)
{
    m_lastModificationDateTime = lastModificationdateTime;
}

// 获取节点内容
QString NodeData::content() const
{
    return m_content;
}

// 设置节点内容
void NodeData::setContent(const QString &content)
{
    m_content = content;
}

// 检查节点是否被修改过
bool NodeData::isModified() const
{
    return m_isModified;
}

// 设置节点的修改状态
void NodeData::setModified(bool isModified)
{
    m_isModified = isModified;
}

// 检查节点是否被选中
bool NodeData::isSelected() const
{
    return m_isSelected;
}

// 设置节点的选中状态
void NodeData::setSelected(bool isSelected)
{
    m_isSelected = isSelected;
}

// 获取滚动条位置
int NodeData::scrollBarPosition() const
{
    return m_scrollBarPosition;
}

// 设置滚动条位置
void NodeData::setScrollBarPosition(int scrollBarPosition)
{
    m_scrollBarPosition = scrollBarPosition;
}

// 获取删除时间
QDateTime NodeData::deletionDateTime() const
{
    return m_deletionDateTime;
}

// 设置删除时间
void NodeData::setDeletionDateTime(const QDateTime &deletionDateTime)
{
    m_deletionDateTime = deletionDateTime;
}

// 获取节点类型
NodeData::Type NodeData::nodeType() const
{
    return m_nodeType;
}

// 设置节点类型
void NodeData::setNodeType(NodeData::Type newNodeType)
{
    m_nodeType = newNodeType;
}

// 获取父节点ID
int NodeData::parentId() const
{
    return m_parentId;
}

// 设置父节点ID
void NodeData::setParentId(int newParentId)
{
    m_parentId = newParentId;
}

// 获取相对位置
int NodeData::relativePosition() const
{
    return m_relativePosition;
}

// 设置相对位置
void NodeData::setRelativePosition(int newRelativePosition)
{
    m_relativePosition = newRelativePosition;
}

// 获取绝对路径
const QString &NodeData::absolutePath() const
{
    return m_absolutePath;
}

// 设置绝对路径
void NodeData::setAbsolutePath(const QString &newAbsolutePath)
{
    m_absolutePath = newAbsolutePath;
}

// 获取标签ID集
const QSet<int> &NodeData::tagIds() const
{
    return m_tagIds;
}

// 设置标签ID集
void NodeData::setTagIds(const QSet<int> &newTagIds)
{
    m_tagIds = newTagIds;
}

// 检查是否为临时节点
bool NodeData::isTempNote() const
{
    return m_isTempNote;
}

// 设置临时节点状态
void NodeData::setIsTempNote(bool newIsTempNote)
{
    m_isTempNote = newIsTempNote;
}

// 获取父节点名称
const QString &NodeData::parentName() const
{
    return m_parentName;
}

// 设置父节点名称
void NodeData::setParentName(const QString &newParentName)
{
    m_parentName = newParentName;
}

// 检查是否为固定节点
bool NodeData::isPinnedNote() const
{
    return m_isPinnedNote;
}

// 设置固定节点状态
void NodeData::setIsPinnedNote(bool newIsPinnedNote)
{
    m_isPinnedNote = newIsPinnedNote;
}

// 获取标签列表滚动条位置
int NodeData::tagListScrollBarPos() const
{
    return m_tagListScrollBarPos;
}

// 设置标签列表滚动条位置
void NodeData::setTagListScrollBarPos(int newTagListScrollBarPos)
{
    m_tagListScrollBarPos = newTagListScrollBarPos;
}

// 获取相对位置AN
int NodeData::relativePosAN() const
{
    return m_relativePosAN;
}

// 设置相对位置AN
void NodeData::setRelativePosAN(int newRelativePosAN)
{
    m_relativePosAN = newRelativePosAN;
}

// 获取子节点计数
int NodeData::childNotesCount() const
{
    return m_childNotesCount;
}

// 设置子节点计数
void NodeData::setChildNotesCount(int newChildCount)
{
    m_childNotesCount = newChildCount;
}

// 获取创建时间
QDateTime NodeData::creationDateTime() const
{
    return m_creationDateTime;
}

// 设置创建时间
void NodeData::setCreationDateTime(const QDateTime &creationDateTime)
{
    m_creationDateTime = creationDateTime;
}

// 重载流提取运算符，读取 NodeData 对象
QDataStream &operator>>(QDataStream &stream, NodeData &nodeData)
{
    int id;
    QString fullTitle;
    QDateTime lastModificationDateTime;
    QDateTime creationDateTime;
    QString content;
    stream >> id >> fullTitle >> creationDateTime >> lastModificationDateTime >> content;
    nodeData.setId(id);
    nodeData.setFullTitle(fullTitle);
    nodeData.setLastModificationDateTime(lastModificationDateTime);
    nodeData.setCreationDateTime(creationDateTime);
    nodeData.setContent(content);
    return stream;
}

// 重载流提取运算符，读取 NodeData 指针对象
QDataStream &operator>>(QDataStream &stream, NodeData *&nodeData)
{
    nodeData = new NodeData();
    QString id;
    QString fullTitle;
    QDateTime lastModificationDateTime;
    QDateTime creationDateTime;
    QString content;
    stream >> id >> fullTitle >> creationDateTime >> lastModificationDateTime >> content;
    nodeData->setId(SpecialNodeID::InvalidNodeId);
    nodeData->setFullTitle(fullTitle);
    nodeData->setLastModificationDateTime(lastModificationDateTime);
    nodeData->setCreationDateTime(creationDateTime);
    nodeData->setContent(content);
    return stream;
}