#include "designatormappingdialog.h"
#include "adddesignatordialog.h"
#include <QMessageBox>
#include <QInputDialog>
#include <QApplication>
#include <QRegularExpression>

DesignatorMappingDialog::DesignatorMappingDialog(DesignatorMappingModel *mappingModel, QWidget *parent)
    : QDialog(parent)
    , m_mappingModel(mappingModel)
{
    setUp();
}

void DesignatorMappingDialog::setUp()
{
    setWindowTitle(tr("Настройки маппинга дезигнаторов"));
    setModal(true);
    resize(800, 600);

    // Создаем модель таблицы
    m_tableModel = new DesignatorMappingTableModel(m_mappingModel, this);

    setUpLayout();
    setUpConnections();
    updateButtons();
}

void DesignatorMappingDialog::setUpLayout()
{
    QVBoxLayout *mainLayout = new QVBoxLayout(this);

    // Группа фильтров
    m_filterGroupBox = new QGroupBox(tr("Фильтры"), this);
    QHBoxLayout *filterLayout = new QHBoxLayout(m_filterGroupBox);

    QLabel *filterLabel = new QLabel(tr("Поиск:"), this);
    m_filterEdit = new QLineEdit(this);
    m_filterEdit->setPlaceholderText(tr("Введите текст для поиска..."));

    m_showOnlyCustomCheckBox = new QCheckBox(tr("Только пользовательские"), this);

    filterLayout->addWidget(filterLabel);
    filterLayout->addWidget(m_filterEdit);
    filterLayout->addWidget(m_showOnlyCustomCheckBox);
    filterLayout->addStretch();

    // Группа таблицы
    m_tableGroupBox = new QGroupBox(tr("Маппинг дезигнаторов"), this);
    QVBoxLayout *tableLayout = new QVBoxLayout(m_tableGroupBox);

    m_tableView = new QTableView(this);
    m_tableView->setModel(m_tableModel);
    m_tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    m_tableView->setSelectionMode(QAbstractItemView::SingleSelection);
    m_tableView->setAlternatingRowColors(true);
    m_tableView->setSortingEnabled(true);
    m_tableView->horizontalHeader()->setStretchLastSection(true);
    m_tableView->horizontalHeader()->setSectionsClickable(true);

    // Настройка размеров колонок
    m_tableView->horizontalHeader()->setSectionResizeMode(0, QHeaderView::ResizeToContents); // Дезигнатор
    m_tableView->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch); // Единственное число
    m_tableView->horizontalHeader()->setSectionResizeMode(2, QHeaderView::Stretch); // Множественное число
    m_tableView->horizontalHeader()->setSectionResizeMode(3, QHeaderView::ResizeToContents); // Пользовательское

    tableLayout->addWidget(m_tableView);

    // Группа кнопок
    m_buttonsGroupBox = new QGroupBox(this);
    QHBoxLayout *buttonsLayout = new QHBoxLayout(m_buttonsGroupBox);

    m_addButton = new QPushButton(tr("Добавить"), this);
    m_removeButton = new QPushButton(tr("Удалить"), this);
    m_resetButton = new QPushButton(tr("Сбросить к умолчанию"), this);
    m_saveButton = new QPushButton(tr("Сохранить"), this);

    buttonsLayout->addWidget(m_addButton);
    buttonsLayout->addWidget(m_removeButton);
    buttonsLayout->addStretch();
    buttonsLayout->addWidget(m_resetButton);
    buttonsLayout->addWidget(m_saveButton);

    // Кнопки диалога
    QHBoxLayout *dialogButtonsLayout = new QHBoxLayout;
    m_okButton = new QPushButton(tr("OK"), this);
    m_cancelButton = new QPushButton(tr("Отмена"), this);

    dialogButtonsLayout->addStretch();
    dialogButtonsLayout->addWidget(m_okButton);
    dialogButtonsLayout->addWidget(m_cancelButton);

    // Добавляем все в основной layout
    mainLayout->addWidget(m_filterGroupBox);
    mainLayout->addWidget(m_tableGroupBox);
    mainLayout->addWidget(m_buttonsGroupBox);
    mainLayout->addLayout(dialogButtonsLayout);

    setLayout(mainLayout);
}

void DesignatorMappingDialog::setUpConnections()
{
    // Соединения для фильтров
    connect(m_filterEdit, &QLineEdit::textChanged,
            this, &DesignatorMappingDialog::onFilterTextChanged);
    connect(m_showOnlyCustomCheckBox, &QCheckBox::toggled,
            this, &DesignatorMappingDialog::onShowOnlyCustomChanged);

    // Соединения для кнопок
    connect(m_addButton, &QPushButton::clicked,
            this, &DesignatorMappingDialog::onAddMapping);
    connect(m_removeButton, &QPushButton::clicked,
            this, &DesignatorMappingDialog::onRemoveMapping);
    connect(m_resetButton, &QPushButton::clicked,
            this, &DesignatorMappingDialog::onResetToDefaults);
    connect(m_saveButton, &QPushButton::clicked,
            this, &DesignatorMappingDialog::onSaveSettings);

    // Соединения для кнопок диалога
    connect(m_okButton, &QPushButton::clicked,
            this, &QDialog::accept);
    connect(m_cancelButton, &QPushButton::clicked,
            this, &QDialog::reject);

    // Соединения для выбора в таблице
    connect(m_tableView->selectionModel(), &QItemSelectionModel::selectionChanged,
            this, &DesignatorMappingDialog::onSelectionChanged);
}

void DesignatorMappingDialog::updateButtons()
{
    QModelIndex currentIndex = m_tableView->currentIndex();
    bool hasSelection = currentIndex.isValid();
    
    m_removeButton->setEnabled(hasSelection);
}

void DesignatorMappingDialog::onAddMapping()
{
    AddDesignatorDialog dialog(this);
    if (dialog.exec() == QDialog::Accepted) {
        QString designator = dialog.getDesignator();
        
        // Проверяем, не существует ли уже такой дезигнатор
        if (m_mappingModel) {
            QList<DesignatorMappingItem> mappings = m_mappingModel->mappings();
            for (const auto &item : mappings) {
                if (item.designator == designator) {
                    QMessageBox::warning(this, tr("Ошибка"),
                                       tr("Дезигнатор '%1' уже существует.").arg(designator));
                    return;
                }
            }
        }
        
        DesignatorMappingItem newItem = dialog.getMapping();
        m_tableModel->addMapping(newItem);
    }
}

void DesignatorMappingDialog::onRemoveMapping()
{
    QModelIndex currentIndex = m_tableView->currentIndex();
    if (!currentIndex.isValid()) {
        return;
    }

    DesignatorMappingItem item = m_tableModel->getMapping(currentIndex.row());
    
    int result = QMessageBox::question(this, tr("Подтверждение удаления"),
                                     tr("Удалить маппинг для дезигнатора '%1'?").arg(item.designator),
                                     QMessageBox::Yes | QMessageBox::No);
    
    if (result == QMessageBox::Yes) {
        m_tableModel->removeMapping(currentIndex.row());
    }
}

void DesignatorMappingDialog::onResetToDefaults()
{
    int result = QMessageBox::question(this, tr("Сброс к умолчанию"),
                                     tr("Все пользовательские настройки будут удалены. Продолжить?"),
                                     QMessageBox::Yes | QMessageBox::No);
    
    if (result == QMessageBox::Yes) {
        if (m_mappingModel) {
            m_mappingModel->resetToDefaults();
        }
    }
}

void DesignatorMappingDialog::onSaveSettings()
{
    if (m_mappingModel) {
        m_mappingModel->saveToDatabase();
        QMessageBox::information(this, tr("Сохранение"),
                               tr("Настройки успешно сохранены в базе данных."));
    }
}

void DesignatorMappingDialog::onFilterTextChanged(const QString &text)
{
    m_tableModel->setFilterText(text);
}

void DesignatorMappingDialog::onShowOnlyCustomChanged(bool checked)
{
    m_tableModel->setShowOnlyCustom(checked);
}

void DesignatorMappingDialog::onSelectionChanged()
{
    updateButtons();
} 