
// Copyright (C) 2020 James Turner <james@flightgear.org>
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License as
// published by the Free Software Foundation; either version 2 of the
// License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful, but
// WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

#include "config.h"

#include "LauncherPackageDelegate.hxx"

#include <QDebug>
#include <QJSEngine>

#include <simgear/package/Root.hxx>

#include <Main/globals.hxx>
#include <Network/HTTPClient.hxx>

#include "LauncherNotificationsController.hxx"

LauncherPackageDelegate::LauncherPackageDelegate(QObject* parent) : QObject(parent)
{
    globals->packageRoot()->addDelegate(this);
    const auto http = globals->get_subsystem<FGHTTPClient>();
    _defaultCatalogId = http->getDefaultCatalogId();
}

LauncherPackageDelegate::~LauncherPackageDelegate()
{
    globals->packageRoot()->removeDelegate(this);
}

void LauncherPackageDelegate::catalogRefreshed(simgear::pkg::CatalogRef aCatalog, simgear::pkg::Delegate::StatusCode aReason)
{
    auto nc = LauncherNotificationsController::instance();

    if (aCatalog) {
        // if catalog download / write to disk failed, show a notification
        if ((aReason == Delegate::FAIL_EXTRACT) ||
            (aReason == Delegate::FAIL_DOWNLOAD) ||
            (aReason == Delegate::FAIL_FILESYSTEM) ||
            (aReason == Delegate::FAIL_VALIDATION)) {
            QJSValue args = nc->jsEngine()->newObject();
            args.setProperty("catalogUri", QString::fromStdString(aCatalog->url()));
            nc->postNotification("catalog-refresh-failed",
                                 QUrl{"qrc:///qml/CatalogRefreshFailedNotification.qml"},
                                 args);
        }
    }

    if ((aReason != Delegate::STATUS_REFRESHED) || !aCatalog) {
        return;
    }

    if (aCatalog->migratedFrom() != simgear::pkg::CatalogRef{}) {
        QJSValue args = nc->jsEngine()->newObject();

        args.setProperty("newCatalogName", QString::fromStdString(aCatalog->name()));

        if (aCatalog->id() == _defaultCatalogId) {
            nc->postNotification("did-migrate-official-catalog-to-" + QString::fromStdString(_defaultCatalogId),
                                 QUrl{"qrc:///qml/DidMigrateOfficialCatalogNotification.qml"},
                                 args);
        } else {
            nc->postNotification("did-migrate-catalog-to-" + QString::fromStdString(aCatalog->id()),
                                 QUrl{"qrc:///qml/DidMigrateOtherCatalogNotification.qml"},
                                 args);
        }
    }
}

void LauncherPackageDelegate::finishInstall(simgear::pkg::InstallRef ref, simgear::pkg::Delegate::StatusCode status)
{
    Q_UNUSED(ref)
    Q_UNUSED(status)
}
