/*******************************************************************************
 * Copyright (c) 2026, Jan Koester jan.koester@gmx.net
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions are met:
 * Redistributions of source code must retain the above copyright
 *      notice, this list of conditions and the following disclaimer.
 * Redistributions in binary form must reproduce the above copyright
 *      notice, this list of conditions and the following disclaimer in the
 *      documentation and/or other materials provided with the distribution.
 * Neither the name of the <organization> nor the
 *      names of its contributors may be used to endorse or promote products
 *      derived from this software without specific prior written permission.
 *
 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
 * DISCLAIMED. IN NO EVENT SHALL <COPYRIGHT HOLDER> BE LIABLE FOR ANY
 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
 * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
 *******************************************************************************/

#include "documentmanager.h"
#include "localapi.h"
#include "publishclient.h"
#include "themeprovider.h"
#include "authimageprovider.h"

#ifdef Windows
#undef Windows
#endif

#include <QApplication>
#include <QIcon>
#include <QCommandLineParser>
#include <QPalette>
#include <QQmlApplicationEngine>
#include <QQmlContext>
#include <QtWebEngineQuick>

int main(int argc, char *argv[]) {
    QtWebEngineQuick::initialize();
    QApplication app(argc, argv);
    app.setApplicationName("blogi-editor");
    app.setOrganizationName("tuxist.de");
    app.setApplicationVersion("1.0.0");
    app.setDesktopFileName("blogi-editor");

    QIcon appIcon = QIcon::fromTheme("blogi-editor");
    if (appIcon.isNull()) {
        appIcon = QIcon(":/blogi-editor.svg");
    }
    app.setWindowIcon(appIcon);

    QCommandLineParser parser;
    parser.setApplicationDescription("Blogi Desktop Editor");
    parser.addHelpOption();
    parser.addVersionOption();

    QCommandLineOption pluginDirOpt(
        QStringList() << "p" << "plugin-dir",
        "Directory containing webedit widget plugins.",
        "directory"
    );
    parser.addOption(pluginDirOpt);
    parser.process(app);

    QString pluginDir = parser.value(pluginDirOpt);
    if (pluginDir.isEmpty()) {
        #ifdef _WIN32
        pluginDir = QCoreApplication::applicationDirPath() + "/../lib/blogi/plugins/webedit";
        #else
        pluginDir = WEBEDIT_PLUGIN_DIR;
        #endif
    }

    DocumentManager docMgr(pluginDir);
    PublishClient pubClient;
    LocalApi localApi(&docMgr, &pubClient);

    QQmlApplicationEngine engine;
    engine.rootContext()->setContextProperty("localApi", &localApi);
    engine.addImageProvider("auth", new AuthImageProvider(&pubClient));

    /* Detect system dark mode via actual palette window color brightness */
    QColor winColor = app.palette().color(QPalette::Window);
    bool isDark = winColor.lightnessF() < 0.5;
    ThemeProvider theme(isDark);
    engine.rootContext()->setContextProperty("Theme", &theme);

    engine.loadFromModule("BlogiEditor", "Main");

    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
