#include "settings_button_widget.h"

#include <QApplication>
#include <QHBoxLayout>
#include <QMouseEvent>
#include <QScreen>

SettingsButtonWidget::SettingsButtonWidget(QWidget *parent)
    : QWidget(parent), button(new QToolButton(this)), popup(new SettingsPopupWidget(nullptr))
{
    button->setIcon(QPixmap("theme:icons/cogwheel"));
    button->setCheckable(true);
    button->setFixedSize(32, 32);
    connect(button, &QToolButton::clicked, this, &SettingsButtonWidget::togglePopup);
    connect(popup, &SettingsPopupWidget::aboutToClose, this, &SettingsButtonWidget::onPopupClosed);

    layout = new QHBoxLayout(this);
    layout->addWidget(button);
    layout->setContentsMargins(0, 0, 0, 0);
    setLayout(layout);
}

void SettingsButtonWidget::addSettingsWidget(QWidget *toAdd) const
{
    popup->addSettingsWidget(toAdd);
}

void SettingsButtonWidget::removeSettingsWidget(QWidget *toRemove) const
{
    popup->removeSettingsWidget(toRemove);
}

void SettingsButtonWidget::setButtonIcon(QPixmap iconMap)
{
    button->setIcon(iconMap);
}

void SettingsButtonWidget::setButtonText(const QString &text)
{
    buttonText = text;

    button->setMinimumSize(QSize(0, 0));
    button->setMaximumSize(QSize(QWIDGETSIZE_MAX, QWIDGETSIZE_MAX));
    button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
    button->setText(text);
    button->setFixedHeight(32);
    button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);

    button->setMinimumWidth(32); // icon-only fallback minimum
}

void SettingsButtonWidget::setCompact(bool _compact)
{
    compact = _compact;
    if (compact) {
        button->setToolButtonStyle(Qt::ToolButtonIconOnly);
        button->setFixedWidth(32);
    } else {
        button->setToolButtonStyle(Qt::ToolButtonTextBesideIcon);
        button->setText(buttonText);
        button->setFixedWidth(QWIDGETSIZE_MAX); // release fixed width
        button->setMinimumWidth(32);
        button->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Fixed);
    }
}

void SettingsButtonWidget::togglePopup()
{
    if (popup->isVisible()) {
        popup->close();
    } else {
        popup->adjustSizeToFitScreen(); // Ensure proper size

        QSize popupSize = popup->size();
        QPoint buttonGlobalPos = button->mapToGlobal(QPoint(0, button->height()));

        QScreen *screen = QApplication::screenAt(buttonGlobalPos);
        QRect screenGeom = screen ? screen->availableGeometry() : QApplication::primaryScreen()->availableGeometry();

        int x = buttonGlobalPos.x();
        int y = buttonGlobalPos.y();

        // Adjust position to stay within screen bounds
        if (x + popupSize.width() > screenGeom.right()) {
            x = buttonGlobalPos.x() - popupSize.width() + button->width();
        }

        if (y + popupSize.height() > screenGeom.bottom()) {
            y = buttonGlobalPos.y() - popupSize.height() - button->height();
        }

        popup->move(x, y);
        popup->show();
        popup->setFocus();
        button->setChecked(true);
    }
}

void SettingsButtonWidget::onPopupClosed() const
{
    button->setChecked(false); // Ensure button unchecks when popup closes
}

void SettingsButtonWidget::mousePressEvent(QMouseEvent *event)
{
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
    if (popup->isVisible() && !popup->geometry().contains(event->globalPosition().toPoint())) {
#else
    if (popup->isVisible() && !popup->geometry().contains(event->globalPos())) {
#endif
        popup->close();
    }
    QWidget::mousePressEvent(event);
}
