#include "projectsettingsdialog.h"
#include "designatormappingdialog.h"
#include <QDebug>

// Статические константы
const QString ProjectSettingsDialog::DEFAULT_VARIANT = "No Variations";

ProjectSettingsDialog::ProjectSettingsDialog(ProjectSettingsModel *settingsModel, 
                                         DesignatorMappingModel *mappingModel, 
                                         QWidget *parent)
    : QDialog(parent)
    , m_settingsModel(settingsModel)
    , m_mappingModel(mappingModel)
{
    setUp();
}

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

void ProjectSettingsDialog::setWidgets()
{
    // Создаем виджет с вкладками
    m_tabWidget = new QTabWidget(this);
    
    // Создаем вкладку для вариантов исполнения
    QWidget *variantTab = new QWidget();
    QVBoxLayout *variantTabLayout = new QVBoxLayout(variantTab);
    
    QGroupBox *variantGroup = new QGroupBox("Вариант исполнения", variantTab);
    QVBoxLayout *variantGroupLayout = new QVBoxLayout(variantGroup);
    
    QLabel *variantLabel = new QLabel("Выберите текущий вариант исполнения:", variantGroup);
    m_variantComboBox = new QComboBox(variantGroup);
    
    // Заполняем комбобокс доступными вариантами
    if (m_settingsModel) {
        QStringList variants = m_settingsModel->availableVariants();
        qDebug() << "ProjectSettingsDialog: Доступные варианты:" << variants;
        m_variantComboBox->addItems(variants);
        
        // Устанавливаем текущий вариант
        QString currentVariant = m_settingsModel->currentVariant();
        qDebug() << "ProjectSettingsDialog: Текущий вариант:" << currentVariant;
        int index = m_variantComboBox->findText(currentVariant);
        if (index >= 0) {
            m_variantComboBox->setCurrentIndex(index);
            qDebug() << "ProjectSettingsDialog: Установлен вариант с индексом:" << index;
        } else {
            qDebug() << "ProjectSettingsDialog: Текущий вариант не найден в списке";
        }
    } else {
        qDebug() << "ProjectSettingsDialog: m_settingsModel равен nullptr";
    }
    
    variantGroupLayout->addWidget(variantLabel);
    variantGroupLayout->addWidget(m_variantComboBox);
    variantTabLayout->addWidget(variantGroup);
    variantTabLayout->addStretch();
    
    // Добавляем вкладку вариантов
    m_tabWidget->addTab(variantTab, "Варианты исполнения");
    
    // Создаем вкладку для маппинга дезигнаторов
    if (m_mappingModel) {
        createDesignatorMappingTab();
    }
    
    // Создаем кнопки
    m_okButton = new QPushButton("OK", this);
    m_cancelButton = new QPushButton("Отмена", this);
    m_resetButton = new QPushButton("Сброс", this);
    m_saveButton = new QPushButton("Сохранить", this);
    
    // Настраиваем диалог
    setWindowTitle("Настройки проекта");
    setModal(true);
    resize(600, 400);
    
    // Устанавливаем основной layout
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    mainLayout->addWidget(m_tabWidget);
    setLayout(mainLayout);
}

void ProjectSettingsDialog::setUpLayout()
{
    // Кнопки
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(m_resetButton);
    buttonLayout->addWidget(m_saveButton);
    buttonLayout->addStretch();
    buttonLayout->addWidget(m_cancelButton);
    buttonLayout->addWidget(m_okButton);
    
    // Добавляем кнопки к основному layout
    QVBoxLayout *mainLayout = qobject_cast<QVBoxLayout*>(layout());
    if (mainLayout) {
        mainLayout->addLayout(buttonLayout);
    }
}

void ProjectSettingsDialog::setUpConnections()
{
    connect(m_okButton, &QPushButton::clicked, this, &QDialog::accept);
    connect(m_cancelButton, &QPushButton::clicked, this, &QDialog::reject);
    connect(m_resetButton, &QPushButton::clicked, this, &ProjectSettingsDialog::onResetToDefaults);
    connect(m_saveButton, &QPushButton::clicked, this, &ProjectSettingsDialog::onSaveSettings);
    
    // Подключение изменения варианта
    connect(m_variantComboBox, QOverload<const QString &>::of(&QComboBox::currentTextChanged),
            this, &ProjectSettingsDialog::onVariantChanged);
    
    // Подключение обновления доступных вариантов
    if (m_settingsModel) {
        connect(m_settingsModel, &ProjectSettingsModel::availableVariantsChanged,
                this, &ProjectSettingsDialog::onAvailableVariantsChanged);
    }
}

void ProjectSettingsDialog::createDesignatorMappingTab()
{
    QWidget *mappingTab = new QWidget();
    QVBoxLayout *mappingTabLayout = new QVBoxLayout(mappingTab);
    
    // Создаем группу для настроек маппинга дезигнаторов
    QGroupBox *mappingGroup = new QGroupBox("Маппинг дезигнаторов компонентов", mappingTab);
    QVBoxLayout *mappingGroupLayout = new QVBoxLayout(mappingGroup);
    
    QLabel *mappingLabel = new QLabel("Настройте соответствие дезигнаторов компонентов их типам:", mappingGroup);
    mappingLabel->setWordWrap(true);
    
    QPushButton *editMappingButton = new QPushButton("Редактировать маппинг", mappingGroup);
    editMappingButton->setMinimumHeight(30);
    
    // Подключаем кнопку к открытию диалога редактирования
    connect(editMappingButton, &QPushButton::clicked, [this]() {
        if (m_mappingModel) {
            DesignatorMappingDialog dialog(m_mappingModel, this);
            dialog.exec();
        }
    });
    
    mappingGroupLayout->addWidget(mappingLabel);
    mappingGroupLayout->addWidget(editMappingButton);
    mappingGroupLayout->addStretch();
    
    mappingTabLayout->addWidget(mappingGroup);
    mappingTabLayout->addStretch();
    
    // Добавляем вкладку
    m_tabWidget->addTab(mappingTab, "Дезигнаторы");
}

QString ProjectSettingsDialog::getCurrentVariant() const
{
    return m_variantComboBox->currentText();
}



void ProjectSettingsDialog::onVariantChanged(const QString &variant)
{
    qDebug() << "ProjectSettingsDialog: Изменен вариант на:" << variant;
    if (m_settingsModel) {
        m_settingsModel->setCurrentVariant(variant);
    }
}

void ProjectSettingsDialog::onAvailableVariantsChanged()
{
    qDebug() << "ProjectSettingsDialog: Обновление доступных вариантов";
    
    if (m_settingsModel && m_variantComboBox) {
        QStringList variants = m_settingsModel->availableVariants();
        qDebug() << "ProjectSettingsDialog: Новые доступные варианты:" << variants;
        
        // Блокируем сигналы во время обновления
        m_variantComboBox->blockSignals(true);
        
        // Очищаем и заполняем комбобокс
        m_variantComboBox->clear();
        m_variantComboBox->addItems(variants);
        
        // Устанавливаем текущий вариант
        QString currentVariant = m_settingsModel->currentVariant();
        int index = m_variantComboBox->findText(currentVariant);
        if (index >= 0) {
            m_variantComboBox->setCurrentIndex(index);
            qDebug() << "ProjectSettingsDialog: Установлен вариант с индексом:" << index;
        } else {
            qDebug() << "ProjectSettingsDialog: Текущий вариант не найден в списке";
        }
        
        // Разблокируем сигналы
        m_variantComboBox->blockSignals(false);
    }
}



void ProjectSettingsDialog::onResetToDefaults()
{
    qDebug() << "ProjectSettingsDialog: Сброс к значениям по умолчанию";
    
    if (m_settingsModel) {
        m_settingsModel->resetToDefaults();
    }
    
    // Обновляем UI
    m_variantComboBox->setCurrentText(DEFAULT_VARIANT);
}

void ProjectSettingsDialog::onSaveSettings()
{
    qDebug() << "ProjectSettingsDialog: Сохранение настроек";
    accept();
} 