// Copyright (C) 2022 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include "qquick3drenderstatspassesmodel_p.h"

#include <QtCore/QRegularExpression>

QT_BEGIN_NAMESPACE

QHash<int, QByteArray> QQuick3DRenderStatsPassesModel::roleNames() const
{
    return { {Qt::DisplayRole, "display"} };
}

int QQuick3DRenderStatsPassesModel::rowCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return m_data.count();
}

int QQuick3DRenderStatsPassesModel::columnCount(const QModelIndex &parent) const
{
    Q_UNUSED(parent);
    return 4;
}

QVariant QQuick3DRenderStatsPassesModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid())
        return QVariant();

    const uint row = index.row();
    const uint column = index.column();

    if (role == Qt::DisplayRole) {
        // Name 0
        if (column == 0)
            return m_data[row].name;
        // Size 1
        if (column == 1)
            return m_data[row].size;
        // Vertices 2
        if (column == 2)
            return m_data[row].vertices;
        // DrawCalls 3
        if (column == 3)
            return m_data[row].drawCalls;
    }

    return QVariant();
}

QVariant QQuick3DRenderStatsPassesModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole || orientation != Qt::Horizontal || section > 4)
        return QVariant();

    switch (section) {
    case 0:
        return QStringLiteral("Name");
    case 1:
        return QStringLiteral("Size");
    case 2:
        return QStringLiteral("Vertices");
    case 3:
        return QStringLiteral("Draw Calls");
    default:
        Q_UNREACHABLE();
        return QVariant();
    }
}

const QString &QQuick3DRenderStatsPassesModel::passData() const
{
    return m_passData;
}

void QQuick3DRenderStatsPassesModel::setPassData(const QString &newPassData)
{
    if (m_passData == newPassData)
        return;

    m_passData = newPassData;
    emit passDataChanged();

    // newPassData is just a markdown table...
    QVector<Data> newData;
    if (!m_passData.isEmpty()) {
        auto lines = m_passData.split(QRegularExpression(QStringLiteral("[\r\n]")), Qt::SkipEmptyParts);
        if (lines.size() > 2) {
            for (qsizetype i = 2; i < lines.size(); ++i) {
                const auto &line = lines.at(i);
                auto fields = line.split(QLatin1Char('|'), Qt::SkipEmptyParts);
                if (fields.size() != 4)
                    continue;
                Data data;
                bool isUInt64 = false;
                bool isUint32 = false;
                data.name = fields[0];
                data.size = fields[1];
                data.vertices = fields[2].toULongLong(&isUInt64);
                if (!isUInt64)
                    continue;
                data.drawCalls = fields[3].toULong(&isUint32);
                if (!isUint32)
                    continue;
                newData.append(data);
            }
        }
    }

    // update the model
    beginResetModel();
    m_data = newData;
    endResetModel();
}

QT_END_NAMESPACE

