/*
    SPDX-FileCopyrightText: 2026 ahouts

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

#include "slugrewriteengine.h"
#include "slugrewriteinterceptor_debug.h"
#include "slugrewritesettings.h"

SlugRewriteEngine::SlugRewriteEngine(QObject *parent)
    : QObject(parent)
{
    reloadRules();
}

SlugRewriteEngine::~SlugRewriteEngine() = default;

SlugRewriteEngine *SlugRewriteEngine::self()
{
    static SlugRewriteEngine s_self;
    return &s_self;
}

void SlugRewriteEngine::reloadRules()
{
    const QStringList matchPrefixes = SlugRewriteSettings::self()->matchPrefixes();
    const QStringList replacePrefixes = SlugRewriteSettings::self()->replacePrefixes();

    if (matchPrefixes.size() != replacePrefixes.size()) {
        qCWarning(SLUGREWRITEINTERCEPTOR_LOG) << "Match and replace prefix lists have different sizes, ignoring rules";
        mRewriter.reset();
        return;
    }

    std::vector<rust::String> rustMatchPrefixes;
    std::vector<rust::String> rustReplacePrefixes;

    for (const auto &prefix : matchPrefixes) {
        rustMatchPrefixes.emplace_back(prefix.toStdString());
    }
    for (const auto &prefix : replacePrefixes) {
        rustReplacePrefixes.emplace_back(prefix.toStdString());
    }

    mRewriter = createRewriter(
        rust::Slice<const rust::String>(rustMatchPrefixes.data(), rustMatchPrefixes.size()),
        rust::Slice<const rust::String>(rustReplacePrefixes.data(), rustReplacePrefixes.size()));
}

bool SlugRewriteEngine::interceptRequest(QWebEngineUrlRequestInfo &info)
{
    if (!mRewriter) {
        return false;
    }

    const std::string url = info.requestUrl().toString().toStdString();
    const RewriteResult result = (*mRewriter)->rewriteUrl(url);

    if (result.matched) {
        const QUrl rewrittenUrl = QUrl(QString::fromStdString(std::string(result.rewrittenUrl)));
        qCDebug(SLUGREWRITEINTERCEPTOR_LOG) << "Rewriting" << info.requestUrl() << "to" << rewrittenUrl;
        info.redirect(rewrittenUrl);
        return true;
    }

    return false;
}

#include "moc_slugrewriteengine.cpp"