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

ProjectParamPreview::ProjectParamPreview(QWidget *parent)
    : QWidget{parent}
    , m_tableModel(nullptr)
{
    setUp();
}

void ProjectParamPreview::setUp(){
    setWidgets();
    setUpLayout();
    setUpConnections();
}

void ProjectParamPreview::setWidgets(){
    m_tableView = new QTableView(this);
    m_tableModel = new ProjectParamTableModel(this);
    
    // Настраиваем таблицу
    m_tableView->setModel(m_tableModel);
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    m_tableView->setAlternatingRowColors(true);
    m_tableView->horizontalHeader()->setStretchLastSection(true);
    m_tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
    m_tableView->verticalHeader()->setVisible(false);
}

void ProjectParamPreview::setUpLayout(){
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(m_tableView);
    mainLayout->setContentsMargins(0, 0, 0, 0);
}

void ProjectParamPreview::setUpConnections(){
    // Подключаем сигналы изменения данных
    connect(m_tableModel, &ProjectParamTableModel::dataChanged,
            this, [this](const QModelIndex &topLeft, const QModelIndex &bottomRight) {
        if (topLeft.isValid() && topLeft.row() < m_tableModel->rowCount()) {
            ProjectParamTableData param = m_tableModel->getProjectParam(topLeft.row());
            emit projectParamChanged(topLeft.row(), param.name, param.value);
        }
    });
}

void ProjectParamPreview::updateView()
{
    if (m_tableView) {
        m_tableView->reset();
        m_tableView->resizeColumnsToContents();
    }
}

void ProjectParamPreview::setProjectParams(const QList<ProjectParamTableData> &params)
{
    if (m_tableModel) {
        m_tableModel->setProjectParams(params);
        updateView();
    }
}

void ProjectParamPreview::addProjectParam(const ProjectParamTableData &param)
{
    if (m_tableModel) {
        m_tableModel->addProjectParam(param);
        emit projectParamAdded(param);
    }
}

void ProjectParamPreview::removeProjectParam(int row)
{
    if (m_tableModel && row >= 0 && row < m_tableModel->rowCount()) {
        m_tableModel->removeProjectParam(row);
        emit projectParamRemoved(row);
    }
}

void ProjectParamPreview::clear()
{
    if (m_tableModel) {
        m_tableModel->clear();
    }
}

ProjectParamTableModel* ProjectParamPreview::tableModel() const
{
    return m_tableModel;
}
