/****************************************************************************
**
** Copyright (C) 2017 The Qt Company Ltd.
** Copyright (C) 2017 Mapbox, Inc.
** Contact: http://www.qt.io/licensing/
**
** This file is part of the QtLocation module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL3$
** 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 http://www.qt.io/terms-conditions. For further
** information use the contact form at http://www.qt.io/contact-us.
**
** GNU Lesser General Public License Usage
** Alternatively, this file may be used under the terms of the GNU Lesser
** General Public License version 3 as published by the Free Software
** Foundation and appearing in the file LICENSE.LGPLv3 included in the
** packaging of this file. Please review the following information to
** ensure the GNU Lesser General Public License version 3 requirements
** will be met: https://www.gnu.org/licenses/lgpl.html.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 2.0 or later as published by the Free
** Software Foundation and appearing in the file LICENSE.GPL included in
** the packaging of this file. Please review the following information to
** ensure the GNU General Public License version 2.0 requirements will be
** met: http://www.gnu.org/licenses/gpl-2.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qgeomappingmanagerenginemapboxgl.h"
#include "qgeomapmapboxgl.h"

#include <QtCore/qstandardpaths.h>
#include <QtLocation/private/qabstractgeotilecache_p.h>
#include <QtLocation/private/qgeocameracapabilities_p.h>
#include <QtLocation/private/qgeomaptype_p.h>

#include <QDir>

QT_BEGIN_NAMESPACE

QGeoMappingManagerEngineMapboxGL::QGeoMappingManagerEngineMapboxGL(const QVariantMap &parameters, QGeoServiceProvider::Error *error, QString *errorString)
:   QGeoMappingManagerEngine()
{
    *error = QGeoServiceProvider::NoError;
    errorString->clear();

    QGeoCameraCapabilities cameraCaps;
    cameraCaps.setMinimumZoomLevel(0.0);
    cameraCaps.setMaximumZoomLevel(20.0);
    cameraCaps.setTileSize(512);
    cameraCaps.setSupportsBearing(true);
    cameraCaps.setSupportsTilting(true);
    cameraCaps.setMinimumTilt(0);
    cameraCaps.setMaximumTilt(60);
    cameraCaps.setMinimumFieldOfView(36.87);
    cameraCaps.setMaximumFieldOfView(36.87);
    setCameraCapabilities(cameraCaps);

    QList<QGeoMapType> mapTypes;
    int mapId = 0;
    const QByteArray pluginName = "mapboxgl";

    if (parameters.contains(QStringLiteral("mapboxgl.china"))) {
        m_useChinaEndpoint = parameters.value(QStringLiteral("mapboxgl.china")).toBool();
    }

    QVariantMap metadata;
    metadata["isHTTPS"] = true;

    if (m_useChinaEndpoint) {
        m_settings.setApiBaseUrl(QStringLiteral("https://api.mapbox.cn"));

        mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-zh-v1"),
                tr("China Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-zh-v1"),
                tr("China Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-zh-v1"),
                tr("China Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
    } else {
        mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/streets-v10"),
                tr("Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/basic-v9"),
                tr("Basic"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::StreetMap, QStringLiteral("mapbox://styles/mapbox/bright-v9"),
                tr("Bright"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::TerrainMap, QStringLiteral("mapbox://styles/mapbox/outdoors-v10"),
                tr("Outdoors"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::SatelliteMapDay, QStringLiteral("mapbox://styles/mapbox/satellite-v9"),
                tr("Satellite"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::HybridMap, QStringLiteral("mapbox://styles/mapbox/satellite-streets-v10"),
                tr("Satellite Streets"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/light-v9"),
                tr("Light"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::GrayStreetMap, QStringLiteral("mapbox://styles/mapbox/dark-v9"),
                tr("Dark"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-day-v2"),
                tr("Navigation Preview Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::TransitMap, QStringLiteral("mapbox://styles/mapbox/navigation-preview-night-v2"),
                tr("Navigation Preview Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-day-v2"),
                tr("Navigation Guidance Day"), false, false, ++mapId, pluginName, cameraCaps, metadata);
        mapTypes << QGeoMapType(QGeoMapType::CarNavigationMap, QStringLiteral("mapbox://styles/mapbox/navigation-guidance-night-v2"),
                tr("Navigation Guidance Night"), false, true, ++mapId, pluginName, cameraCaps, metadata);
    }

    if (parameters.contains(QStringLiteral("mapboxgl.mapping.additional_style_urls"))) {
        const QString ids = parameters.value(QStringLiteral("mapboxgl.mapping.additional_style_urls")).toString();
        const QStringList idList = ids.split(',', QString::SkipEmptyParts);

        for (auto it = idList.crbegin(), end = idList.crend(); it != end; ++it) {
            if ((*it).isEmpty())
                continue;
            if ((*it).startsWith(QStringLiteral("http:")))
                metadata["isHTTPS"] = false;
            else
                metadata["isHTTPS"] = true;

            mapTypes.prepend(QGeoMapType(QGeoMapType::CustomMap, *it,
                    tr("User provided style"), false, false, ++mapId, pluginName, cameraCaps, metadata));
        }
    }

    setSupportedMapTypes(mapTypes);

    if (parameters.contains(QStringLiteral("mapboxgl.access_token"))) {
        m_settings.setAccessToken(parameters.value(QStringLiteral("mapboxgl.access_token")).toString());
    }

    bool memoryCache = false;
    if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.memory"))) {
        memoryCache = parameters.value(QStringLiteral("mapboxgl.mapping.cache.memory")).toBool();
        m_settings.setCacheDatabasePath(QStringLiteral(":memory:"));
    }

    QString cacheDirectory;
    if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.directory"))) {
        cacheDirectory = parameters.value(QStringLiteral("mapboxgl.mapping.cache.directory")).toString();
    } else {
        cacheDirectory = QAbstractGeoTileCache::baseLocationCacheDirectory() + QStringLiteral("mapboxgl/");
    }

    if (!memoryCache && QDir::root().mkpath(cacheDirectory)) {
        m_settings.setCacheDatabasePath(cacheDirectory + "/mapboxgl.db");
    }

    if (parameters.contains(QStringLiteral("mapboxgl.mapping.cache.size"))) {
        bool ok = false;
        int cacheSize = parameters.value(QStringLiteral("mapboxgl.mapping.cache.size")).toString().toInt(&ok);

        if (ok)
            m_settings.setCacheDatabaseMaximumSize(cacheSize);
    }

    if (parameters.contains(QStringLiteral("mapboxgl.mapping.use_fbo"))) {
        m_useFBO = parameters.value(QStringLiteral("mapboxgl.mapping.use_fbo")).toBool();
    }

    if (parameters.contains(QStringLiteral("mapboxgl.mapping.items.insert_before"))) {
        m_mapItemsBefore = parameters.value(QStringLiteral("mapboxgl.mapping.items.insert_before")).toString();
    }

    engineInitialized();
}

QGeoMappingManagerEngineMapboxGL::~QGeoMappingManagerEngineMapboxGL()
{
}

QGeoMap *QGeoMappingManagerEngineMapboxGL::createMap()
{
    QGeoMapMapboxGL* map = new QGeoMapMapboxGL(this, 0);
    map->setMapboxGLSettings(m_settings, m_useChinaEndpoint);
    map->setUseFBO(m_useFBO);
    map->setMapItemsBefore(m_mapItemsBefore);

    return map;
}

QT_END_NAMESPACE
