/****************************************************************************
**
** Copyright (C) 2016 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the test suite of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:GPL-EXCEPT$
** 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.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 as published by the Free Software
** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/

#include "qgeotiledmap_test.h"
#include <QtLocation/private/qgeotiledmap_p_p.h>
#include <QtLocation/private/qgeomapparameter_p.h>

QT_USE_NAMESPACE

class QGeoTiledMapTestPrivate: public QGeoTiledMapPrivate
{
    Q_DECLARE_PUBLIC(QGeoTiledMapTest)
public:
    QGeoTiledMapTestPrivate(QGeoTiledMappingManagerEngine *engine,
                            const QGeoTiledMapTestOptions &options)
        : QGeoTiledMapPrivate(engine), m_options(options)
    {

    }

    ~QGeoTiledMapTestPrivate()
    {

    }

    void addParameter(QGeoMapParameter *param) override
    {
        Q_Q(QGeoTiledMapTest);
        if (param->type() == QStringLiteral("cameraCenter_test")) {
            // We assume that cameraCenter_test parameters have a QGeoCoordinate property named "center"
            // Handle the parameter
            QGeoCameraData cameraData = m_cameraData;
            QGeoCoordinate newCenter = param->property("center").value<QGeoCoordinate>();
            cameraData.setCenter(newCenter);
            q->setCameraData(cameraData);
            // Connect for further changes handling
            q->connect(param, SIGNAL(propertyUpdated(QGeoMapParameter *, const char *)),
                       q, SLOT(onCameraCenter_testChanged(QGeoMapParameter*, const char*)));

        }
    }
    void removeParameter(QGeoMapParameter *param) override
    {
        Q_Q(QGeoTiledMapTest);
        param->disconnect(q);
    }

    virtual void setVisibleArea(const QRectF &visibleArea) override
    {
        if (m_options.supportVisibleArea)
            return QGeoTiledMapPrivate::setVisibleArea(visibleArea);
        else
            return QGeoMapPrivate::setVisibleArea(visibleArea);
    }

    virtual QRectF visibleArea() const override
    {
        if (m_options.supportVisibleArea)
            return QGeoTiledMapPrivate::visibleArea();
        else
            return QGeoMapPrivate::visibleArea();
    }

    QGeoTiledMapTestOptions m_options;
};

QGeoTiledMapTest::QGeoTiledMapTest(QGeoTiledMappingManagerEngine *engine,
                                   const QGeoTiledMapTestOptions &options,
                                   QObject *parent)
:   QGeoTiledMap(*new QGeoTiledMapTestPrivate(engine, options), engine, parent), m_engine(engine)
{
}

void QGeoTiledMapTest::onCameraCenter_testChanged(QGeoMapParameter *param, const char *propertyName)
{
    if (strcmp(propertyName, "center") == 0) {
        QGeoCameraData cameraData = this->cameraData();
        // Not testing for propertyName as this param has only one allowed property
        QGeoCoordinate newCenter = param->property(propertyName).value<QGeoCoordinate>();
        cameraData.setCenter(newCenter);
        setCameraData(cameraData);
    }
}
