/*
    SPDX-FileCopyrightText: 2026 ahouts

    SPDX-License-Identifier: GPL-2.0-or-later
*/

#include "slugrewriteconfigurewidget.h"
#include "slugrewriteengine.h"
#include "slugrewriteruledialog.h"
#include "slugrewritesettings.h"

#include <KLocalizedString>

#include <QCheckBox>
#include <QHBoxLayout>
#include <QHeaderView>
#include <QPushButton>
#include <QTreeWidget>
#include <QVBoxLayout>

SlugRewriteConfigureWidget::SlugRewriteConfigureWidget(QWidget *parent)
    : WebEngineViewer::NetworkPluginUrlInterceptorConfigureWidget(parent)
{
    auto *mainLayout = new QVBoxLayout(this);
    mainLayout->setContentsMargins({});

    mEnabledCheckBox = new QCheckBox(i18nc("@option:check", "Enable URL slug rewriting"), this);
    mainLayout->addWidget(mEnabledCheckBox);

    auto *rulesLayout = new QHBoxLayout;

    mRulesTree = new QTreeWidget(this);
    mRulesTree->setHeaderLabels({i18nc("@title:column", "Match Prefix"), i18nc("@title:column", "Replace With")});
    mRulesTree->setRootIsDecorated(false);
    mRulesTree->header()->setStretchLastSection(true);
    rulesLayout->addWidget(mRulesTree);

    auto *buttonsLayout = new QVBoxLayout;
    mAddButton = new QPushButton(i18nc("@action:button", "Add..."), this);
    mEditButton = new QPushButton(i18nc("@action:button", "Edit..."), this);
    mRemoveButton = new QPushButton(i18nc("@action:button", "Remove"), this);
    buttonsLayout->addWidget(mAddButton);
    buttonsLayout->addWidget(mEditButton);
    buttonsLayout->addWidget(mRemoveButton);
    buttonsLayout->addStretch();
    rulesLayout->addLayout(buttonsLayout);

    mainLayout->addLayout(rulesLayout);

    connect(mAddButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotAdd);
    connect(mEditButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotEdit);
    connect(mRemoveButton, &QPushButton::clicked, this, &SlugRewriteConfigureWidget::slotRemove);
    connect(mRulesTree, &QTreeWidget::itemSelectionChanged, this, &SlugRewriteConfigureWidget::updateButtons);
    connect(mEnabledCheckBox, &QCheckBox::toggled, this, [this]() {
        Q_EMIT configureChanged();
    });

    updateButtons();
}

SlugRewriteConfigureWidget::~SlugRewriteConfigureWidget() = default;

void SlugRewriteConfigureWidget::loadSettings()
{
    mEnabledCheckBox->setChecked(SlugRewriteSettings::self()->slugRewriteEnabled());

    mRulesTree->clear();
    const QStringList matchPrefixes = SlugRewriteSettings::self()->matchPrefixes();
    const QStringList replacePrefixes = SlugRewriteSettings::self()->replacePrefixes();

    const int count = qMin(matchPrefixes.size(), replacePrefixes.size());
    for (int i = 0; i < count; ++i) {
        auto *item = new QTreeWidgetItem(mRulesTree);
        item->setText(0, matchPrefixes.at(i));
        item->setText(1, replacePrefixes.at(i));
    }
}

void SlugRewriteConfigureWidget::saveSettings()
{
    SlugRewriteSettings::self()->setSlugRewriteEnabled(mEnabledCheckBox->isChecked());

    QStringList matchPrefixes;
    QStringList replacePrefixes;

    for (int i = 0; i < mRulesTree->topLevelItemCount(); ++i) {
        const auto *item = mRulesTree->topLevelItem(i);
        matchPrefixes << item->text(0);
        replacePrefixes << item->text(1);
    }

    SlugRewriteSettings::self()->setMatchPrefixes(matchPrefixes);
    SlugRewriteSettings::self()->setReplacePrefixes(replacePrefixes);
    SlugRewriteSettings::self()->save();

    SlugRewriteEngine::self()->reloadRules();
}

void SlugRewriteConfigureWidget::resetSettings()
{
    const bool bUseDefaults = SlugRewriteSettings::self()->useDefaults(true);
    loadSettings();
    SlugRewriteSettings::self()->useDefaults(bUseDefaults);
}

void SlugRewriteConfigureWidget::slotAdd()
{
    SlugRewriteRuleDialog dlg(this);
    if (dlg.exec() == QDialog::Accepted) {
        auto *item = new QTreeWidgetItem(mRulesTree);
        item->setText(0, dlg.matchPrefix());
        item->setText(1, dlg.replacePrefix());
        Q_EMIT configureChanged();
    }
}

void SlugRewriteConfigureWidget::slotEdit()
{
    auto *item = mRulesTree->currentItem();
    if (!item) {
        return;
    }

    SlugRewriteRuleDialog dlg(this);
    dlg.setMatchPrefix(item->text(0));
    dlg.setReplacePrefix(item->text(1));
    if (dlg.exec() == QDialog::Accepted) {
        item->setText(0, dlg.matchPrefix());
        item->setText(1, dlg.replacePrefix());
        Q_EMIT configureChanged();
    }
}

void SlugRewriteConfigureWidget::slotRemove()
{
    auto *item = mRulesTree->currentItem();
    if (item) {
        delete item;
        Q_EMIT configureChanged();
    }
}

void SlugRewriteConfigureWidget::updateButtons()
{
    const bool hasSelection = mRulesTree->currentItem() != nullptr;
    mEditButton->setEnabled(hasSelection);
    mRemoveButton->setEnabled(hasSelection);
}

#include "moc_slugrewriteconfigurewidget.cpp"