/*
 * Copyright (c) 2017 TOYOTA MOTOR CORPORATION
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *      http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

import QtQuick 2.6
import QtQuick.Layouts 1.3
import QtQuick.Controls 2.0
import QtQuick.Window 2.2
import Camera 1.0
import QtWebSockets 1.0

ApplicationWindow {
    id: root
    width: 1080
    height: 1487

    property string als_meter_demo_request_str: ""
    property string api_str: "steering-wheel"
    property var msgid_enu: { "call":2, "retok":3, "reterr":4, "event":5 }
    property int recirc:0
    property int vehiclespeed: 0
    property real enginespeed: 0
    property int wshift: 0

    WebSocket {
        id: websocket
        url: bindingAddressWS

        onStatusChanged: {
            if (websocket.status === WebSocket.Error){
                console.log ("Error: " + websocket.errorString)
                websocket.active = false
                countdown.start()
            }else if (websocket.status === WebSocket.Open){
                console.log ("Socket Open")
                do_subscribe()
            }else if (websocket.status === WebSocket.Closed){
                console.log ("Socket closed")
            }
        }

        onTextMessageReceived: {
            var message_json = JSON.parse(message);
            console.log("Raw response: " + message)

            if (message_json[0] === msgid_enu.event){
                var propertyName = message_json[2].event.split("/")[1]
                if (propertyName === "TransmissionMode"){
                    wshift = message_json[2].data.value
                }else if (propertyName === "VehicleSpeed"){
                    vehiclespeed = message_json[2].data.value
                }else if (propertyName === "EngineSpeed"){
                    enginespeed = message_json[2].data.value
                }
            }else if (message_json[0] === msgid_enu.retok){
                for (var item in message_json[2].response){
                    if (item === "TransmissionMode"){
                        wshift = message_json[2].response["TransmissionMode"]["value"]
                    }else if (item === "VehicleSpeed"){
                        vehiclespeed = message_json[2].response["VehicleSpeed"]["value"]
                    }else if (item === "EngineSpeed"){
                        enginespeed = message_json[2].response["EngineSpeed"]["value"]
                    }
                }
            }else{
                console.log ("Event type error:", message_json[0])
            }
        }

        active: false
    }

    Timer {
        id: countdown
        repeat: false
        interval: 3000
        triggeredOnStart: false
        onTriggered: {
            websocket.active = true
        }
    }

    Item {
        id: topscreen_up
        width: root.width
        height: (root.height - bottomscreen.height)/2

        CameraControl {
            id:cameracontrol_up
            listWH: true
            device: camera_up
            width: root.width
            height:80
        }
        Camera {
            id: camera_up
            width: root.width
            height: topscreen_up.height - cameracontrol_up.height
            anchors.top: cameracontrol_up.bottom
            onIsrunningChanged: {
                camerabg_up.visible = !isrunning

                if (isrunning){
                    if (cameracontrol_dn.device.cameraCnt() === 1)
                        cameracontrol_dn.switchstatus = false;
                }else{
                    cameracontrol_dn.switchstatus = true;
                }
            }
            onCamraCntChanged: {
                if (!camera_dn.isrunning)
                    cameracontrol_dn.number = camera_dn.camranum();

                if (!camera_up.isrunning)
                    cameracontrol_up.number = camera_up.camranum();
            }

            Image {
                id: camerabg_up
                anchors.centerIn: parent
                width: 200
                height: 200
                source: "images/camera/camera_bg.svg"
            }
        }
    }

    Item {
        id: topscreen_dn
        width: root.width
        height: (root.height - bottomscreen.height)/2
        anchors.top: topscreen_up.bottom
        CameraControl {
            id:cameracontrol_dn
            listWH: false
            device: camera_dn
            width: root.width
            height:80
            back:0
        }
        Camera {
            id: camera_dn
            width: root.width
            height: topscreen_dn.height - cameracontrol_dn.height
            anchors.top: cameracontrol_dn.bottom
            onIsrunningChanged: {
                camerabg_dn.visible = !isrunning

                if (isrunning){
                    if (cameracontrol_up.device.cameraCnt() === 1)
                        cameracontrol_up.switchstatus = false;
                }else{
                    cameracontrol_up.switchstatus = true;
                }
            }

            onCamraCntChanged: {
                if (!camera_up.isrunning)
                    cameracontrol_up.number = camera_up.camranum();

                if (!camera_dn.isrunning)
                    cameracontrol_dn.number = camera_dn.camranum();
            }

            Image {
                id: camerabg_dn
                anchors.centerIn: parent
                width: 200
                height: 200
                source: "images/camera/camera_bg.svg"
            }
        }
    }

    Item {
        id: bottomscreen
        width: root.width
        height: 600
        anchors.bottom: parent.bottom
        Image {
            width: parent.width
            height: parent.height
            asynchronous: true
            fillMode: Image.TileHorizontally
            smooth: true
            source: "images/homescreen/homebg_bottom.svg"
        }
        RowLayout {
            id: smtparts
            anchors.left: parent.left
            anchors.right: parent.right
            Speed {
                id: speedparts
                anchors.left: parent.left
                anchors.leftMargin: 30
                anchors.bottom: parent.bottom
                anchors.bottomMargin: 120
                width: imgwidth
                height: imgheight
            }
            ColumnLayout {
                id: tachoparts
                anchors.horizontalCenter: parent.horizontalCenter
                Tacho {
                    anchors.top: parent.top
                    anchors.topMargin: -60
                    anchors.horizontalCenter: parent.horizontalCenter
                    width: imgwidth
                    height: imgheight
                }
                MidOther {
                    anchors.bottom: parent.bottom
                    anchors.bottomMargin: 110
                    anchors.horizontalCenter: parent.horizontalCenter
                    width: imgwidth
                    height: imgheight
                }
            }
            Mid {
                id: midparts
                anchors.right: parent.right
                anchors.rightMargin: 25
                anchors.bottom: parent.bottom
                anchors.bottomMargin: 90
                width: imgwidth
                height: imgheight
            }
        }
    }

    onVisibleChanged: {
        if (visible){
            if (!websocket.active){
                websocket.active = true
            }else{
                do_subscribe()
            }
        }
        else {
            countdown.stop()
            if (websocket.active)
                do_unsubscribe()
        }
    }

    Connections {
        target: appVisible
        onVisibleChanged: {
            if (!visible){
                if (websocket.active)
                    do_unsubscribe()
            }else{
                if (websocket.active){
                    do_subscribe()
                }else{
                    websocket.active = true
                }
            }
        }
    }

    function do_call(binding, verb, event_name) {
        als_meter_demo_request_str = '[' + msgid_enu.call + ',"99999","' + binding+'/'+verb + '", {"event":"' + event_name + '"} ]'
        websocket.sendTextMessage (als_meter_demo_request_str)
    }

    function do_subscribe() {
        do_call(api_str, "subscribe", "VehicleSpeed")
        do_call(api_str, "subscribe", "TransmissionMode")
        do_call(api_str, "subscribe", "EngineSpeed")
    }

    function do_unsubscribe() {
        do_call(api_str, "unsubscribe", "VehicleSpeed")
        do_call(api_str, "unsubscribe", "TransmissionMode")
        do_call(api_str, "unsubscribe", "EngineSpeed")
    }
}