/*
    SPDX-FileCopyrightText: 2014 Vishesh Handa <me@vhanda.in>
    SPDX-FileCopyrightText: 2020 Alexander Lohnau <alexander.lohnau@gmx.de>
    SPDX-FileCopyrightText: 2020 Cyril Rossi <cyril.rossi@enioka.com>
    SPDX-FileCopyrightText: 2022 Fushan Wen <qydwhotmail@gmail.com>

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

#include "krunnersettings.h"

#include <KLocalizedString>
#include <KPluginFactory>

#include <qqml.h>

#include <QDBusConnection>
#include <QDBusMessage>

#include "krunnersettingsbase.h"
#include "krunnersettingsdata.h"

K_PLUGIN_CLASS_WITH_JSON(KRunnerSettings, "kcm_krunnersettings.json")

KRunnerSettings::KRunnerSettings(QObject *parent, const KPluginMetaData &metaData, const QVariantList &args)
    : KQuickManagedConfigModule(parent, metaData)
    , m_data(new KRunnerSettingsData(this))
    , m_historyConfigGroup(KSharedConfig::openConfig(QStringLiteral("krunnerstaterc"), KConfig::NoGlobals, QStandardPaths::GenericDataLocation)
                               ->group("PlasmaRunnerManager")
                               .group("History"))
    , m_historyKeys(m_historyConfigGroup.keyList())
    , m_doesShowPluginButton(args.isEmpty() || args.constFirst() != QLatin1String("openedFromPluginSettings"))
{
    qmlRegisterUncreatableType<KRunnerSettingsBase>("org.kde.plasma.runners.kcm", 1, 0, "KRunnerSettings", QStringLiteral("Only for enums"));

    setButtons(Apply | Default);
}

KRunnerSettingsBase *KRunnerSettings::krunnerSettings() const
{
    return m_data->settings();
}

QStringList KRunnerSettings::historyKeys() const
{
    return m_historyKeys;
}

void KRunnerSettings::configureClearHistoryButton()
{
    const QStringList historyKeys = m_historyConfigGroup.keyList();

    if (historyKeys == m_historyKeys) {
        return;
    }

    m_historyKeys = historyKeys;

    Q_EMIT historyKeysChanged();
}

void KRunnerSettings::deleteAllHistory()
{
    m_historyConfigGroup.deleteGroup(KConfig::Notify);
    m_historyConfigGroup.sync();
    configureClearHistoryButton();
}

void KRunnerSettings::deleteHistoryGroup(const QString &key)
{
    if (key.isEmpty()) {
        return;
    }

    m_historyConfigGroup.deleteEntry(key, KConfig::Notify);
    m_historyConfigGroup.sync();
    configureClearHistoryButton();
}

void KRunnerSettings::save()
{
    KQuickManagedConfigModule::save();

    QDBusMessage message = QDBusMessage::createSignal(QStringLiteral("/krunnerrc"), QStringLiteral("org.kde.kconfig.notify"), QStringLiteral("ConfigChanged"));
    QHash<QString, QByteArrayList> changes = {{QStringLiteral("Plugins"), {}}};
    message.setArguments({QVariant::fromValue(std::move(changes))});
    QDBusConnection::sessionBus().send(message);
}

#include "krunnersettings.moc"
#include "moc_krunnersettings.cpp"
