#include "projectparamtablemodel.h"
#include <QDebug>

ProjectParamTableModel::ProjectParamTableModel(QObject *parent)
    : QAbstractTableModel{parent}
{}

int ProjectParamTableModel::rowCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return m_data.size();
}

int ProjectParamTableModel::columnCount(const QModelIndex &parent) const
{
    if (parent.isValid())
        return 0;
    return 2; // Название и значение
}

QVariant ProjectParamTableModel::data(const QModelIndex &index, int role) const
{
    if (!index.isValid() || index.row() >= m_data.size())
        return QVariant();

    const ProjectParamTableData &param = m_data.at(index.row());

    if (role == Qt::DisplayRole || role == Qt::EditRole) {
        switch (index.column()) {
        case 0: // Название параметра
            return param.name;
        case 1: // Значение параметра
            return param.value;
        default:
            return QVariant();
        }
    }

    return QVariant();
}

QVariant ProjectParamTableModel::headerData(int section, Qt::Orientation orientation, int role) const
{
    if (role != Qt::DisplayRole)
        return QVariant();

    if (orientation == Qt::Horizontal) {
        switch (section) {
        case 0:
            return tr("Название");
        case 1:
            return tr("Значение");
        default:
            return QVariant();
        }
    }

    return QVariant();
}

bool ProjectParamTableModel::setData(const QModelIndex &index, const QVariant &value, int role)
{
    if (!index.isValid() || index.row() >= m_data.size() || role != Qt::EditRole)
        return false;

    ProjectParamTableData &param = m_data[index.row()];
    bool changed = false;

    switch (index.column()) {
    case 0: // Название параметра
        if (param.name != value.toString()) {
            param.name = value.toString();
            changed = true;
        }
        break;
    case 1: // Значение параметра
        if (param.value != value.toString()) {
            param.value = value.toString();
            changed = true;
        }
        break;
    }

    if (changed) {
        emit dataChanged(index, index);
        return true;
    }

    return false;
}

Qt::ItemFlags ProjectParamTableModel::flags(const QModelIndex &index) const
{
    if (!index.isValid())
        return Qt::NoItemFlags;

    return Qt::ItemIsEnabled | Qt::ItemIsSelectable | Qt::ItemIsEditable;
}

void ProjectParamTableModel::setProjectParams(const QList<ProjectParamTableData> &params)
{
    qDebug() << "ProjectParamTableModel: устанавливаем" << params.size() << "параметров";
    beginResetModel();
    m_data = params;
    endResetModel();
    qDebug() << "ProjectParamTableModel: модель обновлена, теперь содержит" << m_data.size() << "параметров";
}

void ProjectParamTableModel::addProjectParam(const ProjectParamTableData &param)
{
    beginInsertRows(QModelIndex(), m_data.size(), m_data.size());
    m_data.append(param);
    endInsertRows();
}

void ProjectParamTableModel::removeProjectParam(int row)
{
    if (row < 0 || row >= m_data.size())
        return;

    beginRemoveRows(QModelIndex(), row, row);
    m_data.removeAt(row);
    endRemoveRows();
}

void ProjectParamTableModel::clear()
{
    if (m_data.isEmpty())
        return;

    beginResetModel();
    m_data.clear();
    endResetModel();
}

ProjectParamTableData ProjectParamTableModel::getProjectParam(int row) const
{
    if (row < 0 || row >= m_data.size())
        return ProjectParamTableData();
    return m_data.at(row);
}

QList<ProjectParamTableData> ProjectParamTableModel::getData() const
{
    return m_data;
}

QMap<QString, QString> ProjectParamTableModel::getDataAsMap() const
{
    QMap<QString, QString> result;
    for (const ProjectParamTableData &param : m_data) {
        result[param.name] = param.value;
    }
    return result;
} 