#include "BankSettingsWindow.h"
#include <QVBoxLayout>
#include <QDir>
#include <QFile>
#include <QHeaderView>
#include <QScrollArea>
#include <QCoreApplication>
#include <QPushButton>
#include <QTableWidget>
#include <utility>
#include <QMessageBox>
#include <QLabel>
#include <QDialog>

#include "dao/ApplicationDAO.h"
#include "db/ApplicationInfo.h"
#include "common/PaddedItemDelegate.h"
#include "device/EditBankDialog.h"
#include "widget/common/CollapsibleSection.h"

QTableWidgetItem *BankSettingsWindow::createTableWidget(const QString &text) {
    QTableWidgetItem *item = new QTableWidgetItem(text);
    item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    return item;
}

BankSettingsWindow::BankSettingsWindow(QWidget *parent, QString deviceId, QString deviceName)
    : QWidget(parent,
              Qt::Window
              | Qt::WindowTitleHint
              | Qt::WindowSystemMenuHint
              | Qt::WindowCloseButtonHint
              | Qt::WindowMinMaxButtonsHint),
      m_deviceId(std::move(deviceId)),
      m_deviceName(std::move(deviceName)
      ) {
    setWindowTitle("Настройки банка [" + m_deviceName + "]");
    setMinimumSize(820, 400);
    setMaximumSize(820, 400);
    resize(820, 400);

    auto *mainLayout = new QVBoxLayout(this);

    // Скролл-область
    auto *scrollArea = new QScrollArea(this);
    scrollArea->setWidgetResizable(true);

    // Виджет-контейнер, в котором будет layout с таблицами и лейблами
    auto *contentWidget = new QWidget;
    auto *layout = new QVBoxLayout(contentWidget);

    // Убираем отступы и рамку
    contentWidget->setContentsMargins(0, 0, 0, 0); // Убираем отступы
    layout->setContentsMargins(0, 0, 0, 0); // Убираем отступы у layout
    scrollArea->setStyleSheet("border: none;"); // Убираем рамку
    layout->setAlignment(Qt::AlignTop);

    QList<ApplicationInfo> applications = ApplicationDAO::getApplicationsByDeviceId(m_deviceId);

    QTableWidget *tableWidget = new QTableWidget(this);
    tableWidget->setSelectionMode(QAbstractItemView::NoSelection);
    tableWidget->setFocusPolicy(Qt::NoFocus);
    tableWidget->setStyleSheet(
        "QTableWidget {"
        "    border: 1px solid grey;"
        // "    gridline-color: lightgrey;"
        // "    background-color: #f9f9f9;"
        "    font-size: 14px;"
        "}"
        "QHeaderView::section {"
        // "    background-color: #e0e0e0;"
        // "    border: 1px solid grey;"
        "    padding: 4px;"
        "    font-weight: bold;"
        "    text-align: left center;"
        "}"
        "QTableWidget::item {"
        "    padding: 2px;"
        "    border: none;"
        "    text-align: left;"
        " vertical-align: middle; "
        "}"
        "QTableWidget::item:selected {"
        // "    background-color: #cce5ff;"
        // "    color: #003366;"
        "}"
        "QTableCornerButton::section {"
        // "    background-color: #e0e0e0;"
        // "    border: 1px solid grey;"
        "}"
        "QPushButton {"
        "border-radius: 4px;"
        "height: 26px;"
        "}"
        "QPushButton[btnClass='delete'] {"
        "background-color: red;"
        "}"
        "QPushButton[btnClass='edit'] {"
        "background-color: green;"
        "}"
        "QPushButton[btnClass='delete']:pressed {"
        "background-color: blue;"
        "}"
        "QPushButton[btnClass='edit']:pressed {"
        "background-color: blue;"
        "}"
    );
    tableWidget->setRowCount(applications.length());
    tableWidget->setColumnCount(7);
    tableWidget->setHorizontalHeaderLabels({
        "",
        "Имя",
        "Пин-код",
        "Статус",
        "Комментарий",
        "",
        ""
    });

    tableWidget->setWordWrap(true);
    tableWidget->setTextElideMode(Qt::ElideNone);

    QMargins cellPadding{8, 4, 8, 4};
    auto *delegate = new PaddedItemDelegate(cellPadding, tableWidget);
    tableWidget->setItemDelegateForColumn(1, delegate);
    tableWidget->setItemDelegateForColumn(2, delegate);
    tableWidget->setItemDelegateForColumn(3, delegate);
    tableWidget->setItemDelegateForColumn(4, delegate);

    tableWidget->horizontalHeader()->setDefaultAlignment(Qt::AlignLeft | Qt::AlignVCenter);
    for (int i = 0; i < 8; ++i) {
        tableWidget->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents);
    }
    tableWidget->horizontalHeader()->setSectionResizeMode(1, QHeaderView::Stretch);
    tableWidget->horizontalHeader()->setSectionResizeMode(4, QHeaderView::Stretch);


    for (int k = 0; k < applications.size(); ++k) {
        const ApplicationInfo &app = applications[k];


        auto *icon = new QLabel(tableWidget);
        QPixmap pixmap(QCoreApplication::applicationDirPath() + "/images/alfa_icon.png");
        icon->setPixmap(pixmap);
        icon->setPixmap(pixmap.scaled(20, 20, Qt::KeepAspectRatio, Qt::SmoothTransformation));
        icon->setStyleSheet(
            "background-color: transparent;"
            "padding:0 4px 0 0;"
        );
        icon->setMinimumSize(24, 20);
        tableWidget->setCellWidget(k, 0, icon);

        tableWidget->setItem(k, 1, createTableWidget(app.name == "rshb" ? "Россельхозбанк" : app.name));
        tableWidget->setItem(k, 2, createTableWidget(app.pinCode));
        tableWidget->setItem(k, 3, createTableWidget(app.status));

        QTableWidgetItem *item = new QTableWidgetItem(app.comment);
        item->setTextAlignment(Qt::AlignLeft | Qt::AlignTop);
        item->setFlags(item->flags() & ~Qt::ItemIsEditable);
        item->setSizeHint(QSize(100, app.comment.length() / 2)); // Минимальная высота ячейки для переноса
        tableWidget->setItem(k, 4, item);

        // auto *deleteBtnItem = new QTableWidgetItem;
        // tableWidget->setItem(k, 4, deleteBtnItem);
        auto *deleteBtn = new QPushButton("  Удалить  ", tableWidget);
        deleteBtn->setProperty("btnClass", "delete");
        // deleteBtn->setStyleSheet("padding: 4px 8px;");
        // deleteBtn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
        tableWidget->setCellWidget(k, 5, deleteBtn);

        connect(deleteBtn, &QPushButton::clicked, this, [this, app]() {
            QMessageBox msgBox(this);
            msgBox.setWindowTitle(tr("Подтверждение"));
            msgBox.setText("Точно удалить все данные банка: " + app.name + "?");
            // добавляем свои кнопки с нужными надписями
            QPushButton *deleteBtn = msgBox.addButton(tr("Удалить"), QMessageBox::AcceptRole);
            QPushButton *closeBtn = msgBox.addButton(tr("Отмена"), QMessageBox::RejectRole);
            // по умолчанию фокус на «Закрыть»
            msgBox.setDefaultButton(closeBtn);
            // делаем окно модальным и блокируем всё остальное
            msgBox.setModal(true);
            msgBox.exec(); // <-- блокирует до закрытия сообщения

            if (msgBox.clickedButton() == deleteBtn) {
                // тут выполняем удаление
            } else {
                // просто закрыли — ничего не делаем
            }
        });

        // auto *editBtn = new QTableWidgetItem;
        // tableWidget->setItem(k, 5, editBtn);
        auto *btn = new QPushButton("  Редактировать  ", tableWidget);
        btn->setProperty("btnClass", "edit");
        // btn->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed);
        tableWidget->setCellWidget(k, 6, btn);
        connect(btn, &QPushButton::clicked, this, [this]() {
            BankEditDialog dlg(this);
            if (dlg.exec() == QDialog::Accepted) {
                // Пользователь нажал «OK»
                QString v1 = dlg.firstValue();
                QString v2 = dlg.secondValue();
                bool on = dlg.toggled();
                // … обработка значений …
            } else {
                // Пользователь нажал «Cancel» или закрыл окно
            }
        });
    }
    layout->addWidget(tableWidget);
    tableWidget->resizeRowsToContents();

    // Добавим вертикальный Spacer в конец, чтобы прокручиваемая область не растягивала контент
    // QSpacerItem *spacer = new QSpacerItem(20, 40, QSizePolicy::Minimum, QSizePolicy::Expanding);
    // layout->addItem(spacer);

    contentWidget->setLayout(layout);
    scrollArea->setWidget(contentWidget);
    mainLayout->addWidget(scrollArea);
    setLayout(mainLayout);
}
