#include "columnsettingsdialog.h"
#include "../controller/maincontroller.h"
#include "../model/componenttablemodel.h"
#include "../model/projectsettingsmodel.h"
#include <QDebug>

// Статические константы
const QStringList ColumnSettingsDialog::COLUMN_NAMES = QStringList() << "Поз.обозначение" << "Наименование" << "Кол." << "Примечание";
const QStringList ColumnSettingsDialog::DEFAULT_MAPPINGS = QStringList() << "Designator" << "<Пусто>" << "<Пусто>" << "<Пусто>";

ColumnSettingsDialog::ColumnSettingsDialog(const QStringList &availableProperties, 
                                         const QStringList &currentMappings,
                                         QWidget *parent)
    : QDialog(parent)
    , m_availableProperties(availableProperties)
    , m_currentMappings(currentMappings)
    , m_controller(nullptr)
{
    setUp();
}

ColumnSettingsDialog::ColumnSettingsDialog(MainController *controller, QWidget *parent)
    : QDialog(parent)
    , m_controller(controller)
{
    // Загружаем настройки из контроллера
    if (m_controller) {
        m_controller->loadProjectSettingsFromDatabase();
        m_availableProperties = m_controller->componentTableModel()->propertyNames();
        m_currentMappings = m_controller->projectSettingsModel()->columnMappings();
    }
    setUp();
}

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

void ColumnSettingsDialog::setWidgets()
{
    // Создаем комбобоксы для каждой колонки
    for (int i = 0; i < COLUMN_NAMES.size(); ++i) {
        QComboBox *comboBox = new QComboBox(this);
        
        // Делаем комбобокс редактируемым для ввода выражений
        comboBox->setEditable(true);
        
        // Добавляем доступные свойства
        for (const QString &property : m_availableProperties) {
            comboBox->addItem(property);
        }
        
        // Устанавливаем текущее значение
        if (i < m_currentMappings.size()) {
            QString currentMapping = m_currentMappings[i];
            int index = comboBox->findText(currentMapping);
            if (index >= 0) {
                comboBox->setCurrentIndex(index);
            } else {
                // Если значение не найдено в списке, устанавливаем его как текст
                comboBox->setCurrentText(currentMapping);
            }
        }
        
        m_columnComboBoxes.append(comboBox);
    }
    
    // Создаем кнопки
    m_okButton = new QPushButton("OK", this);
    m_cancelButton = new QPushButton("Отмена", this);
    m_resetButton = new QPushButton("Сброс", this);
    
    // Настраиваем диалог
    setWindowTitle("Настройки колонок");
    setModal(true);
    resize(400, 300);
}

void ColumnSettingsDialog::setUpLayout()
{
    QVBoxLayout *mainLayout = new QVBoxLayout(this);
    
    // Создаем сетку для колонок
    QGridLayout *gridLayout = new QGridLayout();
    
    // Заголовки
    gridLayout->addWidget(new QLabel("Колонка", this), 0, 0);
    gridLayout->addWidget(new QLabel("Источник данных", this), 0, 1);
    
    // Строки для каждой колонки
    for (int i = 0; i < COLUMN_NAMES.size(); ++i) {
        QLabel *columnLabel = new QLabel(COLUMN_NAMES[i], this);
        gridLayout->addWidget(columnLabel, i + 1, 0);
        gridLayout->addWidget(m_columnComboBoxes[i], i + 1, 1);
    }
    
    mainLayout->addLayout(gridLayout);
    
    // Кнопки
    QHBoxLayout *buttonLayout = new QHBoxLayout();
    buttonLayout->addWidget(m_resetButton);
    buttonLayout->addStretch();
    buttonLayout->addWidget(m_cancelButton);
    buttonLayout->addWidget(m_okButton);
    
    mainLayout->addLayout(buttonLayout);
}

void ColumnSettingsDialog::setUpConnections()
{
    connect(m_okButton, &QPushButton::clicked, this, [this]() {
        // Сохраняем настройки перед закрытием
        saveSettings();
        accept();
    });
    connect(m_cancelButton, &QPushButton::clicked, this, &QDialog::reject);
    connect(m_resetButton, &QPushButton::clicked, this, [this]() {
        // Сбрасываем к значениям по умолчанию
        for (int i = 0; i < m_columnComboBoxes.size() && i < DEFAULT_MAPPINGS.size(); ++i) {
            int index = m_columnComboBoxes[i]->findText(DEFAULT_MAPPINGS[i]);
            if (index >= 0) {
                m_columnComboBoxes[i]->setCurrentIndex(index);
            }
        }
    });
}

QStringList ColumnSettingsDialog::getColumnMappings() const
{
    QStringList mappings;
    for (QComboBox *comboBox : m_columnComboBoxes) {
        mappings.append(comboBox->currentText());
    }
    return mappings;
}

void ColumnSettingsDialog::saveSettings()
{
    qDebug() << "ColumnSettingsDialog: Сохранение настроек столбцов";
    if (m_controller) {
        // Сохраняем настройки столбцов в модель настроек
        QStringList mappings = getColumnMappings();
        m_controller->projectSettingsModel()->setColumnMappings(mappings);
        
        // Сохраняем в базу данных
        m_controller->saveProjectSettingsToDatabase();
        
        // Синхронизируем настройки колонок с PerechenTableController
        m_controller->syncColumnMappingsWithPerechenController();
        
        qDebug() << "ColumnSettingsDialog: Настройки столбцов синхронизированы с PerechenTableController";
    }
}

void ColumnSettingsDialog::loadSettings()
{
    qDebug() << "ColumnSettingsDialog: Загрузка настроек столбцов";
    if (m_controller) {
        m_controller->loadProjectSettingsFromDatabase();
        m_currentMappings = m_controller->projectSettingsModel()->columnMappings();
        
        // Обновляем UI
        for (int i = 0; i < m_columnComboBoxes.size() && i < m_currentMappings.size(); ++i) {
            QString mapping = m_currentMappings[i];
            int index = m_columnComboBoxes[i]->findText(mapping);
            if (index >= 0) {
                m_columnComboBoxes[i]->setCurrentIndex(index);
            } else {
                m_columnComboBoxes[i]->setCurrentText(mapping);
            }
        }
    }
} 