/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the Qt 3D Studio Demos.
**
** $QT_BEGIN_LICENSE:BSD$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** BSD License Usage
** Alternatively, you may use this file under the terms of the BSD license
** as follows:
**
** "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 Qt Company Ltd 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 THE COPYRIGHT
** OWNER OR CONTRIBUTORS 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."
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include <QtGui/QGuiApplication>
#include <QtCore/QDir>
#include <QtQuick/QQuickView>
#include <QtQml/QQmlEngine>
#include <QtQml/QQmlContext>
#include <QtGui/QScreen>
#include <QtQml/QQmlPropertyMap>
#include "housemodel.h"
#if defined(KNX_BACKEND)
#include "qmlknxdemo.h"
#endif

// Uncomment for 1280x900 window
//#define FIXEDWINDOW

int applyFontRatio(const int value, const int ratioFont)
{
    return int(value * ratioFont);
}

int applyRatio(const int value, const int ratio)
{
    return qMax(2, int(value * ratio));
}

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

#if defined(Q_OS_MACOS)
    QSurfaceFormat openGLFormat;
    openGLFormat.setRenderableType(QSurfaceFormat::OpenGL);
    openGLFormat.setProfile(QSurfaceFormat::CoreProfile);
    openGLFormat.setMajorVersion(4);
    openGLFormat.setMinorVersion(1);
    openGLFormat.setStencilBufferSize(8);
    QSurfaceFormat::setDefaultFormat(openGLFormat);
#endif

    // Define size variants for scaling
    qreal refDpi = 96.;
    qreal refWidth = 1280.;
    qreal refHeight = 900.;
    QRect rect = QGuiApplication::primaryScreen()->geometry();
    qreal width = rect.width();
    qreal height = rect.height();
    qreal dpi = QGuiApplication::primaryScreen()->logicalDotsPerInch();
    qreal widthRatio = width / refWidth;
    qreal heightRatio = height / refHeight;
    qreal ratioFont = qMin(height * dpi / (refDpi * refHeight), width * dpi / (refDpi * refWidth));
    if (widthRatio < 1.)
        widthRatio = 1;
    if (heightRatio < 1.)
        heightRatio = 1;
    if (ratioFont < 1.)
        ratioFont = 1;

#ifdef FIXEDWINDOW
    width = refWidth;
    height = refHeight;
    widthRatio = 1;
    heightRatio = 1;
    ratioFont = 1;
#endif

    QQmlPropertyMap sizesMap;
    sizesMap.insert(QStringLiteral("screenHeight"), QVariant(height));
    sizesMap.insert(QStringLiteral("screenWidth"), QVariant(width));
    sizesMap.insert(QStringLiteral("fontSize"), QVariant(applyFontRatio(26, ratioFont)));
    sizesMap.insert(QStringLiteral("controlHeight"), QVariant(applyFontRatio(64, ratioFont)));
    sizesMap.insert(QStringLiteral("labelMouseMargin"), QVariant(applyRatio(20, widthRatio)));
    sizesMap.insert(QStringLiteral("controlMargin"), QVariant(applyRatio(20, widthRatio)));
    sizesMap.insert(QStringLiteral("controlBorderWidth"), QVariant(applyRatio(3, widthRatio)));
    sizesMap.insert(QStringLiteral("sliderMaxWidth"), QVariant(applyRatio(300, widthRatio)));

    QQuickView viewer;

    viewer.engine()->addImportPath(QStringLiteral(":/qml/imports"));

#ifndef Q_OS_ANDROID
    // Hack to get self build working.
    // Also needs the Qt3DStudio\bin directory in run environment path.
    //viewer.engine()->addImportPath(QStringLiteral("C:/Qt/Tools/Qt3DStudio/qml"));
#endif

#if defined(KNX_BACKEND)
    qmlRegisterUncreatableType<QmlKnxDemo>("QmlKnxDemo", 1, 0, "QmlKnxDemo", "Not instantiated from QML");
    QmlKnxDemo *m_knxBackend = new QmlKnxDemo;
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), m_knxBackend);
#else
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("knxBackend"), nullptr);
#endif

    HouseModel *m_houseModel = new HouseModel;
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("houseModel"), m_houseModel);

    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("sizesMap"), &sizesMap);
    viewer.engine()->rootContext()->setContextProperty(QStringLiteral("heightRatio"), heightRatio);

    viewer.setSource(QUrl(QStringLiteral("qrc:/main.qml")));

    viewer.setTitle(QStringLiteral("Qt 3D Studio Home Automation Demo"));
    viewer.setResizeMode(QQuickView::SizeViewToRootObject);
#ifdef FIXEDWINDOW
    viewer.setMinimumSize(QSize(width, height));
    viewer.setMaximumSize(QSize(width, height));
    viewer.show();
#else
    viewer.showFullScreen();
#endif

    return app.exec();
}