#include "taglistmodel.h"
#include "tagpool.h"//获取、检查和更新标签数据
#include <QDebug>//用于调试输出
#include "nodepath.h"

// TagListModel类的构造函数
TagListModel::TagListModel(QObject *parent) : QAbstractListModel(parent), m_tagPool{ nullptr } { }
// 初始化父类QAbstractListModel，并将m_tagPool初始化为nullptr

// 设置标签池的函数
void TagListModel::setTagPool(TagPool *tagPool)
{
    beginResetModel(); // 开始重置模型，通知视图模型即将改变
    m_tagPool = tagPool; // 设置标签池指针
    connect(tagPool, &TagPool::dataReset, this,
            [this] { // 连接标签池的dataReset信号到一个lambda表达式槽
                beginResetModel(); // 标签池数据重置时，开始重置模型
                updateTagData(); // 更新标签数据
                endResetModel(); // 结束重置模型，通知视图模型已改变
            });
    endResetModel(); // 结束重置模型
}

// 设置模型数据的函数
void TagListModel::setModelData(const QSet<int> &data)
{
    if (!m_tagPool) { // 如果标签池未初始化
        qDebug() << __FUNCTION__ << "Tag pool is not init yet"; // 输出调试信息
        return;
    }
    beginResetModel(); // 开始重置模型
    m_ids = data; // 设置标签ID集合
    updateTagData(); // 更新标签数据
    endResetModel(); // 结束重置模型
}

// 添加标签的函数
void TagListModel::addTag(int tagId)
{
    if (!m_tagPool) { // 如果标签池未初始化
        qDebug() << __FUNCTION__ << "Tag pool is not init yet"; // 输出调试信息
        return;
    }
    if (m_tagPool->contains(tagId)) { // 如果标签池包含该标签ID
        beginInsertRows(QModelIndex(), rowCount(), rowCount()); // 开始插入行，通知视图即将插入新行
        m_data.append(m_tagPool->getTag(tagId)); // 将标签添加到数据向量中
        endInsertRows(); // 结束插入行，通知视图已插入新行
    } else {
        qDebug() << __FUNCTION__ << "Tag is not in pool:" << tagId; // 输出调试信息
    }
}

// 重载rowCount函数，返回模型的行数
int TagListModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent); // 声明parent参数未使用，避免编译器警告
    return m_data.count(); // 返回标签数据向量的大小
}

QVariant TagListModel::data(const QModelIndex &index, int role) const// 返回指定索引和角色的数据
{
    if (!index.isValid()) { // 如果索引无效
        return QVariant(); // 返回空的QVariant对象
    }
    const TagData &tag = m_data[index.row()]; // 获取对应索引行的标签数据
    if (role == IdRole) { // 如果角色是IdRole
        return tag.id(); // 返回标签的ID
    } else if (role == NameRole) { // 如果角色是NameRole
        return tag.name(); // 返回标签的名称
    } else if (role == ColorRole) { // 如果角色是ColorRole
        return tag.color(); // 返回标签的颜色
    }
    return QVariant(); // 如果角色不匹配，返回空的QVariant对象
}


void TagListModel::updateTagData()// 更新标签数据的函数
{
    m_data.clear(); // 清空标签数据向量
    for (const auto &id : qAsConst(m_ids)) { // 遍历标签ID集合
        if (m_tagPool->contains(id)) { // 如果标签池包含该标签ID
            m_data.append(m_tagPool->getTag(id)); // 将标签添加到数据向量中
        } else {
            qDebug() << __FUNCTION__ << "Tag is not in pool:" << id; // 输出调试信息
        }
    }
}
