/****************************************************************************
**
** Copyright (C) 2019-2022 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com
** Copyright (C) 2019-2022 General Magic B.V., info@generalmagic.com
**
** BSD License Usage
**
** 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 Klarälvdalens Datakonsult AB 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."
****************************************************************************/

import QtQuick 2.12
import QtQuick.Controls 2.12
import QtQuick.Layouts 1.12
//! [SearchService plumbing]
import QtQuick.Window 2.12
import GeneralMagic 2.0

Window {
    visible: true
    width: 640
    height: 480
    title: qsTr("Free Text Search Example")
    property var updater: ServicesManager.contentUpdater(ContentItem.Type.RoadMap)
    Component.onCompleted: {
        //! [Set token safely]
        ServicesManager.settings.token = __my_secret_token;
        //! [Set token safely]

        ServicesManager.settings.allowInternetConnection = true; // enable connection to online services
        updater.autoApplyWhenReady = true;
        updater.update();
    }
//! [SearchService plumbing]

    //! [SearchService timer]
    Timer {
        id: searchTimer
        interval: 500
        onTriggered: {
            searchService.searchNow();
        }
    }
    //! [SearchService timer]

    //! [SearchService model]
    SearchService {
        id: searchService
        filter: searchBar.text
        searchMapPOIs: true
        searchAddresses: true
        limit: 10

        function searchNow() {
            searchTimer.stop();
            cancel();
            referencePoint = mapView.cursorWgsPosition();
            search();
        }
    }
    //! [SearchService model]

    MapView {
        id: mapView
        anchors.fill: parent
        gesturesEnabled: true

        Component.onCompleted: mapView.centerOnCoordinates(ServicesManager.createCoordinates(45.465361, 9.184940), 67);

        ColumnLayout {
            anchors.fill: parent
            anchors.topMargin: 15
            anchors.leftMargin: 15
            anchors.rightMargin: 15
            anchors.bottomMargin: 30

            //! [SearchService input]
            TextField {
                id: searchBar
                Layout.fillWidth: true
                placeholderText: qsTr("Where would you like to go?")
                onTextChanged: searchTimer.restart()
                onEditingFinished: searchService.searchNow()
            }
            //! [SearchService input]

            Rectangle {
                Layout.fillHeight: true
                Layout.fillWidth: true
                color: Qt.rgba(0,0,0,0.5)
                visible: searchBar.focus
                //! [SearchService list]
                ListView {
                    id: searchList
                    anchors.fill: parent
                    clip: true
                    model: searchService
                    function distance(meters)
                    {
                        return meters >= 1000 ? (meters / 1000.).toFixed(3) + " Km" :  meters.toFixed(0) + " m";
                    }
                    delegate: Item {
                        height: row.height
                        RowLayout {
                            id: row
                            IconView {
                                iconSource: landmark.icon
                                Layout.maximumHeight: row.height
                                Layout.maximumWidth: row.height
                                width: height
                                height: row.height
                            }
                            ColumnLayout {
                                Layout.fillHeight: true
                                Layout.fillWidth: true
                                Text {
                                    Layout.fillWidth: true
                                    text: landmark.name + " (" + searchList.distance(landmark.coordinates.distance(searchService.referencePoint)) + ")"
                                    color: "white"
                                    font.pixelSize: 16
                                    wrapMode: Text.WrapAnywhere
                                }
                                Text {
                                    Layout.fillWidth: true
                                    text: landmark.description
                                    color: "white"
                                    font.pixelSize: 14
                                    font.italic: true
                                    wrapMode: Text.WrapAnywhere
                                }
                            }
                        }
                        MouseArea {
                            anchors.fill: row
                            onClicked: {
                                mapView.centerOnCoordinates(searchService.get(index).coordinates, -1);
                                searchBar.focus = true;
                            }
                        }
                    }
                }
                //! [SearchService list]
            }
            Item {
                Layout.fillHeight: true
                Layout.fillWidth: true
            }
            RowLayout {
                Button {
                    enabled: searchService.length
                    text: "Highlight list on the map "
                    onClicked:  {
                        if (mapView.zoomLevel < 65)
                            mapView.zoomLevel = 65;
                        mapView.highlightLandmarkList(searchService)
                    }
                }
                Button {
                    text: "Hide Highlighted list"
                    onClicked: mapView.hideHighlights()
                }
            }
        }
    }
}
