#include "componentspreview.h"


ComponentsPreview::ComponentsPreview(ComponentTableModel* model, QWidget *parent)
    : QWidget{parent}, m_model(model)
{
    setUp();
}

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

void ComponentsPreview::setWidgets(){
    m_variantComboBox = new QComboBox(this);
    m_tableView = new FreezeTableWidget(this);
    
    // Устанавливаем модель для таблицы
    if (m_model) {
        m_tableView->setModel(m_model);
        // Настраиваем замороженные столбцы (ID и обозначение) после установки модели
        m_tableView->setFrozenColumns(2);
    }
}

void ComponentsPreview::setUpLayout(){
    QVBoxLayout* mainLayout = new QVBoxLayout(this);
    QGroupBox* groupBox = new QGroupBox("Варианты исполнения", this);
    QHBoxLayout* groupBoxLayout = new QHBoxLayout(groupBox);
    groupBoxLayout->addWidget(m_variantComboBox);
    mainLayout->addWidget(groupBox);
    mainLayout->addWidget(m_tableView);
}

void ComponentsPreview::setUpConnections()
{
    // Подключение изменения варианта
    connect(m_variantComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
            [this](const QString &text) {
                qDebug() << "ComponentsPreview: Изменение варианта в комбобоксе:" << text;
                emit variantChanged(text);
            });
    
    // Подключение выбора компонента
    connect(m_tableView->selectionModel(), &QItemSelectionModel::currentChanged,
            [this](const QModelIndex &current, const QModelIndex &previous) {
                if (current.isValid()) {
                    emit componentSelected(current.row());
                }
            });
    
    // Подключение двойного клика
    connect(m_tableView, &QTableView::doubleClicked,
            [this](const QModelIndex &index) {
                emit componentDoubleClicked(index.row());
            });
    
    // Подключение обновления списка вариантов
    if (m_model) {
        connect(m_model, &ComponentTableModel::variantsChanged,
                this, &ComponentsPreview::updateVariantComboBox);
        connect(m_model, &ComponentTableModel::currentVariantChanged,
                [this]() {
                    if (m_model && m_variantComboBox->currentText() != m_model->currentVariant()) {
                        m_variantComboBox->setCurrentText(m_model->currentVariant());
                    }
                });
        
        // Инициализируем комбобокс
        updateVariantComboBox();
    }
}

void ComponentsPreview::updateVariantComboBox()
{
    if (!m_model || !m_variantComboBox)
        return;
    
    qDebug() << "ComponentsPreview: Обновление комбобокса вариантов";
    
    // Блокируем сигналы во время обновления
    m_variantComboBox->blockSignals(true);
    
    QString currentText = m_variantComboBox->currentText();
    m_variantComboBox->clear();
    
    // Добавляем варианты из модели
    QStringList variants = m_model->variants();
    m_variantComboBox->addItems(variants);
    
    qDebug() << "ComponentsPreview: Доступные варианты:" << variants;
    qDebug() << "ComponentsPreview: Текущий вариант модели:" << m_model->currentVariant();
    qDebug() << "ComponentsPreview: Текущий текст комбобокса:" << currentText;
    
    // Приоритет: сначала пытаемся установить текущий вариант модели
    QString modelCurrentVariant = m_model->currentVariant();
    if (!modelCurrentVariant.isEmpty() && variants.contains(modelCurrentVariant)) {
        m_variantComboBox->setCurrentText(modelCurrentVariant);
        qDebug() << "ComponentsPreview: Установлен вариант модели:" << modelCurrentVariant;
    } else if (!currentText.isEmpty() && variants.contains(currentText)) {
        // Если текущий вариант модели не найден, пытаемся сохранить предыдущий выбор
        m_variantComboBox->setCurrentText(currentText);
        qDebug() << "ComponentsPreview: Установлен предыдущий выбор:" << currentText;
    } else if (!variants.isEmpty()) {
        // Если ничего не подходит, устанавливаем первый доступный вариант
        m_variantComboBox->setCurrentIndex(0);
        qDebug() << "ComponentsPreview: Установлен первый доступный вариант:" << variants.first();
    } else {
        qDebug() << "ComponentsPreview: Нет доступных вариантов";
    }
    
    // Разблокируем сигналы
    m_variantComboBox->blockSignals(false);
}

void ComponentsPreview::updateView()
{
    // Обновляем комбобокс вариантов
    updateVariantComboBox();
    
    // Обновляем таблицу
    if (m_tableView && m_model) {
        m_tableView->reset();
        m_tableView->resizeColumnsToContents();
    }
}

void ComponentsPreview::setCurrentVariant(const QString &variant)
{
    qDebug() << "ComponentsPreview: setCurrentVariant вызван с вариантом:" << variant;
    
    if (!m_variantComboBox)
        return;
    
    // Блокируем сигналы во время установки
    m_variantComboBox->blockSignals(true);
    
    // Устанавливаем вариант в модели компонентов ПЕРЕД установкой в комбобокс
    if (m_model) {
        m_model->setCurrentVariant(variant);
        qDebug() << "ComponentsPreview: Вариант установлен в модели компонентов";
    }
    
    // Устанавливаем вариант в комбобокс
    int index = m_variantComboBox->findText(variant);
    if (index >= 0) {
        m_variantComboBox->setCurrentIndex(index);
        qDebug() << "ComponentsPreview: Вариант установлен в комбобокс с индексом:" << index;
    } else {
        qDebug() << "ComponentsPreview: Вариант не найден в комбобоксе:" << variant;
    }
    
    // Разблокируем сигналы
    m_variantComboBox->blockSignals(false);
}

