/*
    Speed Climbing Stopwatch - Simple Stopwatch for Climbers
    Copyright (C) 2018  Itsblue Development - Dorian Zeder

    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU Affero General Public License as published
    by the Free Software Foundation, version 3 of the License.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU Affero General Public License for more details.

    You should have received a copy of the GNU Affero General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
*/

import QtQuick 2.9
import QtMultimedia 5.8
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import QtQuick.Layouts 1.3

Popup {
    id: root
    x: startButt.x
    y: startButt.y
    width: startButt.width
    height: startButt.height
    modal: true
    dim: false

    enter: Transition {
        NumberAnimation { properties: "scale"; from: 0; to: 1; duration: 300; easing.type: Easing.Linear }
    }

    exit: Transition {
        NumberAnimation { properties: "scale"; from: 1; to: 0; duration: 300; easing.type: Easing.Linear }
    }

    background: Rectangle {
        radius: width * 0.5
        color: "white"
        border.color: "grey"
        border.width: 1

        Label {
            id: head_text
            text: options_stack.currentItem.title
            font.pixelSize: headlineUnderline.width * 0.1
            anchors {
                horizontalCenter: parent.horizontalCenter
                top: parent.top
                topMargin: headlineUnderline.anchors.topMargin / 2 - height / 2
            }
        }

        Rectangle {
            id: headlineUnderline
            height: 1
            width: parent.width
            color: "grey"
            anchors {
                top: parent.top
                left: parent.left
                right: parent.right
                topMargin: parent.height * 0.15
                rightMargin: parent.radius - Math.sqrt(Math.pow(parent.radius,2)-Math.pow(parent.radius-anchors.topMargin,2))
                leftMargin: parent.radius - Math.sqrt(Math.pow(parent.radius,2)-Math.pow(parent.radius-anchors.topMargin,2))
            }
        }

        ProgressCircle {
            id: prog
            property string text: "connecting.."
            anchors.fill: parent
            opacity: 0
            lineWidth: 5

            arcBegin: 0
            arcEnd: 0

            Timer {
                id: prog_refresh
                running: false
                interval: 1
                repeat: true
                onTriggered: {
                    prog.arcEnd = 360 * ( _cppBuzzerConn.get("connection_progress") / 100 )
                }
            }

            Label {
                id: content
                text: parent.text
                anchors.centerIn: parent
                font.pixelSize: parent.width * 0.1

            }
        }

        Button {
            id: head_back

            anchors {
                left: parent.left
                leftMargin: parent.width * 0.17
                top:parent.top
                topMargin: parent.height * 0.01
            }
            height: parent.height * 0.13
            width:height

            background: Rectangle {
                radius: width * 0.5
                color: "white"
                border.color: "grey"
                border.width: 1
                Image {
                    anchors.fill: parent
                    anchors.margins: parent.width * 0.2
                    source: "qrc:/graphics/icons/back_black.png"

                }
            }

            onClicked: {
                 options_stack.depth > 1 ? options_stack.pop():root.close()
            }

            onPressedChanged: {
                if(pressed){
                    background.color = "lightgrey"
                }
                else {
                    background.color = "white"
                }
            }
            Behavior on opacity {
                NumberAnimation {
                    duration: 100
                }
            }
        }
    }

    StackView {
        id: options_stack
        property int text_pixelSize: root.height * 0.06
        initialItem: settings
        width: headlineUnderline.width

        anchors  {
            top: parent.top
            left: parent.left
            leftMargin: ( parent.width - headlineUnderline.width ) / 2
            topMargin: headlineUnderline.anchors.topMargin * 0.8
            bottom: parent.bottom
        }

        Behavior on opacity {
            NumberAnimation {duration: 200}
        }

        /*-----start page of the settings-----*/
        Component {
            id: settings

            Column {
                property string title: qsTr("Options")
                id: settings_col

                /*----Connect to buzzer----*/
                ItemDelegate {
                    id: connect_del
                    width: parent.width
                    text: _cppBuzzerConn.get("connected")===1 ? qsTr("connected to buzzer"):qsTr("connect to buzzer")
                    font.pixelSize: options_stack.text_pixelSize
                    Timer {
                        running: connect_del.scale === 1
                        repeat: true
                        interval: 10
                        onTriggered: {
                            connect_del.text = _cppBuzzerConn.get("connected")===1 ? qsTr("connected to buzzer"):qsTr("connect to buzzer")
                        }
                    }

                    onClicked: {
                        root.closePolicy = Popup.NoAutoClose
                        options_stack.opacity = 0

                        prog.arcEnd = 0
                        prog.colorCircle = "grey"
                        prog.opacity = 1
                        prog.text = qsTr("connecting...")
                        prog_refresh.running = true

                        if(_cppBuzzerConn.connect()){
                            prog_refresh.running = false
                            prog.colorCircle = "green"
                            prog.text = qsTr("success")
                            prog.arcEnd = 360
                        }
                        else {
                            prog_refresh.running = false
                            prog.colorCircle = "red"
                            prog.text = qsTr("error")
                            prog.arcEnd = 360
                        }

                        //make a short delay and go back to normal options
                        shortDelay.start()
                    }

                    Timer {
                        id: shortDelay
                        running: false
                        repeat: false
                        interval: 1000
                        onTriggered: {
                            connect_del.enabled = true;
                            prog.opacity = 0;
                            options_stack.opacity = 1
                            root.closePolicy = Popup.CloseOnPressOutside;
                        }
                    }
                }

                /*----Automated Start----*/
                ItemDelegate {
                    id: autostart_del
                    text: qsTr("start sequence")
                    font.pixelSize: options_stack.text_pixelSize
                    width: parent.width

                    Rectangle {
                        color: "grey"
                        height: 1
                        width: parent.width * 0.9
                        anchors {
                            horizontalCenter: parent.horizontalCenter
                            top: parent.top
                        }
                    }

                    Image {
                        id: autostart_del_image
                        source: "qrc:/graphics/icons/back_black.png"
                        rotation: 180
                        height: options_stack.text_pixelSize
                        width: height
                        anchors {
                            verticalCenter: parent.verticalCenter
                            right: parent.right
                            rightMargin: 10
                        }
                    }
                    onClicked: {
                        options_stack.push(autostart)
                    }
                }
            }
        }

        /*-----Page to setup automatc start sequence-----*/
        Component {
            id: autostart
            Column {
                id: autostart_col
                property string title: "Autostart"
                property int delegateHeight: height*0.18

                SwitchDelegate {
                    id: ready_del
                    text: qsTr("say 'ready'")
                    checked: _cppAppSettings.loadSetting("ready_en") === "true"
                    width: parent.width
                    height: parent.delegateHeight

                    font.pixelSize: options_stack.text_pixelSize

                    onCheckedChanged: {
                        _cppAppSettings.writeSetting("ready_en",checked)
                    }

                    indicator: SimpleIndicator{}
                }

                ItemDelegate {
                    id: ready_delay_del
                    text: qsTr("delay (ms)")
                    enabled: ready_del.checked
                    width: parent.width
                    font.pixelSize: options_stack.text_pixelSize
                    height: parent.delegateHeight

                    TextField {
                        focus: true
                        placeholderText: qsTr("time")
                        width: parent.width * 0.3
                        height: parent.height
                        anchors.right: parent.right
                        anchors.verticalCenter: parent.verticalCenter
                        inputMethodHints: Qt.ImhFormattedNumbersOnly

                        text: _cppAppSettings.loadSetting("ready_delay")

                        onTextChanged: {
                            _cppAppSettings.writeSetting("ready_delay", text)
                        }
                    }
                }

                SwitchDelegate {
                    id: at_marks_del
                    text: qsTr("say\n'at your marks'")
                    checked: _cppAppSettings.loadSetting("at_marks_en") === "true"
                    width: parent.width
                    //height: parent.delegateHeight * 1.5

                    font.pixelSize: options_stack.text_pixelSize

                    onCheckedChanged: {
                        _cppAppSettings.writeSetting("at_marks_en",at_marks_del.checked)
                    }

                    indicator: SimpleIndicator{}
                }

                ItemDelegate {
                    id: at_marks_delay_del
                    text: qsTr("delay (ms)")
                    enabled: at_marks_del.checked
                    width: parent.width
                    height: parent.delegateHeight

                    font.pixelSize: options_stack.text_pixelSize

                    TextField {
                        focus: true
                        placeholderText: qsTr("time")
                        width: parent.width * 0.3
                        height: parent.height
                        anchors.right: parent.right
                        anchors.verticalCenter: parent.verticalCenter
                        inputMethodHints: Qt.ImhFormattedNumbersOnly

                        text: _cppAppSettings.loadSetting("at_marks_delay")

                        onTextChanged: {
                            _cppAppSettings.writeSetting("at_marks_delay",text)
                        }
                    }
                }
            }
        }

        /*-----Custom animations-----*/

        pushEnter: Transition {
            NumberAnimation {
                property: "opacity"
                from: 0
                to: 1
                duration: 200
                easing.type: Easing.InOutQuad
            }
        }
        pushExit: Transition {
            NumberAnimation {
                property: "opacity"
                from: 1
                to: 0
                duration: 200
                easing.type: Easing.InOutQuad
            }
        }

        popExit: Transition {
            NumberAnimation {
                property: "opacity"
                from: 1
                to: 0
                duration: 200
                easing.type: Easing.InOutQuad
            }
        }
        popEnter: Transition {
            NumberAnimation {
                property: "opacity"
                from: 0
                to: 1
                duration: 200
                easing.type: Easing.InOutQuad
            }
        }
    }


}
