// Copyright (C) 2021 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only

#include <QGuiApplication>
#include <QQmlApplicationEngine>

#include <QtQuick3D>

#include <QtCore/qcommandlineparser.h>
#include <QtCore/qcommandlineoption.h>

// For component loading case
#include <QtQuick3D/private/qquick3dcustommaterial_p.h>

int main(int argc, char *argv[])
{
    qputenv("QT_QUICK3D_EDITORMODE", "1");
#if QT_VERSION < QT_VERSION_CHECK(6, 0, 0)
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
#endif

    QGuiApplication app(argc, argv);
    app.setApplicationName("Material Editor");
    app.setOrganizationName("QtProject");
    app.setOrganizationDomain("qt-project.org");
    app.setApplicationVersion(QLatin1String(QT_VERSION_STR));

    QSurfaceFormat::setDefaultFormat(QQuick3D::idealSurfaceFormat(4));

    QCommandLineParser cmdLineparser;
    cmdLineparser.setApplicationDescription("Editor for creating custom materials for use with Qt Quick 3D");
    cmdLineparser.addHelpOption();

    QCommandLineOption modeOption({QChar(u'm'), QLatin1String("mode")}, QLatin1String("sets editor mode"), QLatin1String("c"));
    cmdLineparser.addOption(modeOption);

    QCommandLineOption changeDirOption({QChar(u'C'), QLatin1String("directory")}, QLatin1String("Change the working directory"), QLatin1String("dir"));
    cmdLineparser.addOption(changeDirOption);

    QCommandLineOption projectDirOption({QChar(u'p'), QLatin1String("project-dir")}, QLatin1String("Project directory"), QLatin1String("dir"));
    cmdLineparser.addOption(projectDirOption);

    QCommandLineOption verboseOutputOption({QChar(u'v'), QLatin1String("verbose")}, QLatin1String("Turn on verbose output."));
    cmdLineparser.addOption(verboseOutputOption);

    cmdLineparser.process(app);

    bool workingDirSet = false;
    if (cmdLineparser.isSet(changeDirOption)) {
        const auto value = cmdLineparser.value(changeDirOption);
        QFileInfo fi(value);
        workingDirSet = fi.isDir();
        if (workingDirSet)
            QDir::setCurrent(value);
        else
            qWarning("%s : %s - Not a directory", qPrintable(app.applicationName()), qPrintable(value));
    }

    QString resourceFile;
    auto args = cmdLineparser.positionalArguments();
    for (const auto &arg : std::as_const(args)) {
        if (arg.endsWith(".qml"))
            resourceFile = arg;
    }

    if (!resourceFile.isEmpty() && QFileInfo::exists(resourceFile)) {
        QFileInfo resourceFileInfo(resourceFile);
        if (resourceFileInfo.isFile()) {
            if (!workingDirSet)
                QDir::setCurrent(resourceFileInfo.dir().path());

            resourceFile = resourceFileInfo.canonicalFilePath();
        }
    }

    QString projectPath;
    if (cmdLineparser.isSet(projectDirOption)) {
        const auto value = cmdLineparser.value(projectDirOption);
        QFileInfo fi(value);
        if (fi.isDir())
            projectPath = fi.canonicalFilePath();
        else
            qWarning("%s : %s - Not a directory", qPrintable(app.applicationName()), qPrintable(value));
    }

    QQmlApplicationEngine engine;
    if (auto ctx = engine.rootContext())
        ctx->setContextProperty("_qtProjectDir", QUrl::fromLocalFile(projectPath));
    const QUrl url(QStringLiteral("qrc:/qt-project.org/imports/QtQuick3D/MaterialEditor/main.qml"));
    engine.load(url);
    if (engine.rootObjects().isEmpty())
        return -1;

    return app.exec();
}
