/*!
 *
 * Copyright (c) 2021-2023 Diality Inc. - All Rights Reserved.
 * \copyright
 * THIS CODE MAY NOT BE COPIED OR REPRODUCED IN ANY FORM, IN PART OR IN
 * WHOLE, WITHOUT THE EXPLICIT PERMISSION OF THE COPYRIGHT OWNER.
 *
 * \file    SettingsStack.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      29-Mar-2023
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  16-Apr-2021
 *
 */

// Qt
import QtQuick                  2.12
import QtQuick.Controls         2.12 // Switch

// Project
import Gui.Actions 0.1

//  Qml imports
import "qrc:/"
import "qrc:/globals"
import "qrc:/components"
import "qrc:/compounds"
import "qrc:/pages"

/*!
 * \brief   SettingsStack is the screen
 * which contains the main stack for all the Settings screens
 * This is the screen which will show up when "Settings" option
 * is selected from the main menu.
 */
StackItem { id : _root
    objectName: "_SettingsStack"

    stackView.initialItem   : _settingsHome

    property bool   serviceMode : false

    enum ItemsIndex {
        Information     ,
        VolumeBrightness,
        WiFi            ,
        Bluetooth       ,
        DGSettings      ,
        Services        ,
        SetDateTime     ,
        ExportLogs      ,
        RoInput         ,
        Language        ,
        Calibration     ,
        SWUpdate        ,
        FactoryReset
    }
    property var itemsText  : [
        qsTr("Information"                  ), // Information
        qsTr("Volume And Brightness"        ), // VolumeBrightness
        qsTr("Wi-Fi"                        ), // WiFi
        qsTr("Bluetooth Cuff"               ), // Bluetooth
        qsTr("DG Cleaning"                  ), // DGSettings
        qsTr("Service"                      ), // Service
        qsTr("Set Date And Time"            ), // SetDateTime
        qsTr("Export Logs"                  ), // ExportLogs
        qsTr("Water Input Mode"             ), // RoInput
        qsTr("Set Language"                 ), // Language
        qsTr("Calibration "                 ), // Calibration
        qsTr("Software Update"              ), // SWUpdate
        qsTr("Factory Reset"                ), // FactoryReset
    ]
    property var itemsEnabled  : [
        true                                 , // Information
        true                                 , // VolumeBrightness
        true                                 , // WiFi
        true                                 , // Bluetooth
        true                                 , // DGSettings
        true                                 , // Services
        true                                 , // SetDateTime
        true                                 , // ExportLogs
        true                                 , // RoInput
        false                                , // Language
        false                                , // Calibration
        false                                , // SWUpdate
        false                                , // FactoryReset
    ]
    property var itemsVisible  : [
        true                                 , // Information
        true                                 , // VolumeBrightness
        true                                 , // WiFi
        true                                 , // Bluetooth
        true                                 , // DGSettings
      ! serviceMode                          , // Services
        serviceMode                          , // SetDateTime
        true                                 , // ExportLogs
        true                                 , // RoInput
        false /* serviceMode phase 1 */      , // Language
        false /* serviceMode phase 1 */      , // Calibration
        false /* serviceMode phase 1 */      , // SWUpdate
        false /* serviceMode phase 1 */      , // FactoryReset
    ]

    SettingsHome { id   : _settingsHome
        title           : serviceMode ? qsTr("Service") : qsTr("Device Settings")
        backVisible     : false
        confirmVisible  : serviceMode
        confirmText.text: qsTr("SHUTDOWN")
        onConfirmClicked: _GuiView.doActionTransmit(GuiActions.ID_PowerOff, GuiActions.NoData)
        itemsText       : _root.itemsText
        itemsEnabled    : _root.itemsEnabled
        itemsVisible    : _root.itemsVisible
        onItemClicked   : {
            switch (vIndex) {
            case SettingsStack.Information:
                push(_settingsInformation)
                break

            case SettingsStack.VolumeBrightness:
                vDevice.doInitBrightness()
                push(_settingsVolumeBrightness)
                break

            case SettingsStack.WiFi:
                vNetwork.doInit()
                push( _settingsWiFi )
                // _settingsWiFi.setFocus() // No keyboard popup.
                break

            case SettingsStack.Bluetooth:
                push( _settingsBluetooth )
                break

            case SettingsStack.DGSettings:
                push( _settingsDGSettings )
                break

            case SettingsStack.Services:
                push(_servicePassword)
                _servicePassword.setFocus()
                break

            case SettingsStack.SetDateTime:
                vDateTime.doInit()
                push( _settingsDateTime )
                _settingsDateTime.setFocus()
                break

            case SettingsStack.ExportLogs:
                push( _settingsExportLogs )
                break

            case SettingsStack.RoInput:
                push( _settingsRoInput )
                break

            default:
                console.debug("Unknown Index", vIndex)
                break
            }
        }
    }

    SettingsBase                { id: _settingsInformation
        itemIndex       : SettingsStack.Information
        confirmVisible  : false
        onVisibleChanged: {
            if ( visible ) {
                vAdjustmentVersions     .doAdjustment()
                vAdjustmentServiceDates .doAdjustment()
            }
        }

        TouchGrid {
            anchors.centerIn: parent
            colCount    : 2
            colSpacing  : 50
            rowCount    : 8
            rowSpacing  : 0
            itemHeight  : 50
            itemWidth   : 550
            touchable   : false
            itemsHasLine: [
                0, // title C1
                1,1,1,1,1,1,1,
                0, // title C2
                1,1,1,1,
            ]
            itemsValueLeftMargin: 300
            itemsValue  : [
                ""                                          ,
                Qt                      .application.version,
                vAdjustmentVersions     .hdVerDevice        ,
                vAdjustmentVersions     .hdVerFPGA          ,
                vAdjustmentVersions     .hdSerial           ,
                vAdjustmentVersions     .dgVerDevice        ,
                vAdjustmentVersions     .dgVerFPGA          ,
                vAdjustmentVersions     .dgSerial           ,
                "",
                vAdjustmentServiceDates .hdLastServiceDate  ,
                vAdjustmentServiceDates .hdNextServiceDate  ,
                vAdjustmentServiceDates .dgLastServiceDate  ,
                vAdjustmentServiceDates .dgNextServiceDate  ,
            ]
            itemsText   : [
                qsTr("Versions"             ), // col1 title
                qsTr("UI Version"           ),
                qsTr("HD Version"           ),
                qsTr("HD FPGA Version"      ),
                qsTr("HD Serial Number"     ),
                qsTr("DG Version"           ),
                qsTr("DG FPGA Version"      ),
                qsTr("DG Serial Number"     ),

                qsTr("Service"              ), // col2 title
                qsTr("HD Last Service Date" ),
                qsTr("HD Next Service Date" ),
                qsTr("DG Last Service Date" ),
                qsTr("DG Next Service Date" ),

            ]
        }
    }

    SettingsVolumeBrightness    { id: _settingsVolumeBrightness
        itemIndex               : SettingsStack.VolumeBrightness
    }

    SettingsDateTime            { id: _settingsDateTime
        itemIndex               : SettingsStack.SetDateTime
    }

    SettingsWiFi                { id: _settingsWiFi
        itemIndex               : SettingsStack.WiFi
    }

    SettingsBluetoothCuff       { id: _settingsBluetooth
    }

    SettingsDG                  { id: _settingsDGSettings
        itemIndex               : SettingsStack.DGSettings
    }

    SettingsExportLogs          { id: _settingsExportLogs
        itemIndex               : SettingsStack.ExportLogs
    }

    SettingsBase                { id: _settingsRoInput
        confirmVisible          : false
        itemIndex               : SettingsStack.RoInput


        Row { id: _settingsRoInputRow
            anchors.centerIn: parent

            Text { id           : _settingsRoInputLabel
                text            : qsTr("Pure Water Mode")
                width           : 300
                height          : _settingsRoInputSwitch.height
                color           : Colors.white
                font.pixelSize: Fonts.fontPixelButton
                verticalAlignment       : Text.AlignVCenter
                horizontalAlignment     : Text.AlignLeft
            }

            Switch { id: _settingsRoInputSwitch
                property bool active: true

                checked : vDuetRoWaterDG.status

                width   : 85
                height  : 85

                indicator: Rectangle {
                    implicitWidth   : Variables.sliderCircleDiameter * 1.7
                    implicitHeight  : Variables.sliderCircleDiameter - ( Variables.progressbarHandlerBorderWidth * 2 )
                    radius          : implicitHeight
                    anchors.centerIn: parent
                    color           : _settingsRoInputSwitch.checked ? Colors.backgroundButtonSelect  : Colors.createTreatmentInactive
                    border.color    : _settingsRoInputSwitch.checked ? Colors.borderButton            : Colors.createTreatmentInactive
                    Rectangle {
                        property real diameter  : Variables.sliderCircleDiameter
                        x: _settingsRoInputSwitch.checked ? parent.width - width : 0
                        anchors.verticalCenter: parent.verticalCenter
                        width   : diameter
                        height  : diameter
                        radius  : diameter
                        color   : _settingsRoInputSwitch.active ? Colors.highlightProgressBar : Colors.createTreatmentInactive
                        border  {
                            width: Variables.progressbarHandlerBorderWidth
                            color: Colors.textMain
                        }
                    }
                }

                contentItem: Text {
                    width   : parent.width
                    height  : parent.height
                    text    : _settingsRoInputSwitch.checked ? qsTr("ON") : qsTr("OFF")
                    font.pixelSize: Fonts.fontPixelButton
                    color   : _settingsRoInputSwitch.active  ? Colors.textMain : Colors.textDisableButton
                    verticalAlignment       : Text.AlignTop
                    horizontalAlignment     : Text.AlignHCenter
                }
            }
        }

        Connections { target: _settingsRoInputSwitch
            function onCheckedChanged() {
                vDuetRoWaterDG.doAdjustment ( _settingsRoInputSwitch.checked )
            }
        }
        Connections { target: vDuetRoWaterDG
            function onAdjustmentTriggered(vValue) {
                if ( vDuetRoWaterDG.adjustment_Accepted ) {
                    _settingsRoInput.notificationText = ""
                }
                else {
                    _settingsRoInput.notificationText = vDuetRoWaterDG.notification // adjustment_ReasonText
                }
                vSettings.roWaterMode = vDuetRoWaterDG.status
            }
        }
    }

    UserConfirmation            { id: _servicePassword
        property bool isPassword_Accepted   : false
        property bool isDefaultPasswordSet  : (vSettings.servicePass != "")

        itemIndex : SettingsStack.Services
        title     : isDefaultPasswordSet ? qsTr("Service Password") : qsTr("Set Service Password")
        isPassword: true
        showPasswordReEntryField: !isDefaultPasswordSet
        onBackClicked   : {
            clearPassword()
            if(!isDefaultPasswordSet){
                clearPasswordReEntry()
            }
            _settingsHome.notificationText = ""
        }
        onConfirmClicked: {
            isPassword_Accepted = false
            let password        = _servicePassword.password
            if ( !isDefaultPasswordSet ) {
                let passwordReEntry = _servicePassword.passwordReEntry
                if ( password != passwordReEntry        )   { _servicePassword.notificationText = qsTr("Mismatched Password Entry"); return }
                if (!vSettings.isPasswordValid(password))   { _servicePassword.notificationText = qsTr("Malformed Password Entry" ); return }

                vSettings.updatePassword(password)
                _servicePassword.isPassword_Accepted = true
                _servicePassword.notificationText = ""
                clearPasswordReEntry()
            } else {
                if (!vSettings.isPasswordMatch(password))   { _servicePassword.notificationText = qsTr("Incorrect service password"); return }

                _servicePassword.isPassword_Accepted = true
                _servicePassword.notificationText = ""
                vAdjustmentServiceMode.doAdjustment()
                if ( vSettings.noCANBus ) { // if NoCANBus is set don't wait for HD and go to service mode.
                    gotoServiceMode(true)
                }
            }
            clearPassword()
            pop() // pop back to settings screen and wait for the HD-OpMode change to Service_Mode to update the settings screen.
        }
    }

    Connections { target: vAdjustmentServiceMode
        function onAdjustmentTriggered              ( vValue ) {
            if ( vAdjustmentServiceMode.adjustment_Accepted ) {
                _settingsHome.notificationText = ""
            }
            else {
                _settingsHome.notificationText = vAdjustmentServiceMode.text()
            }
        }
    }

    function gotoServiceMode( vservice ) {
        if ( ! _servicePassword.isPassword_Accepted ) return
        serviceMode      = vservice
        if ( vservice )
            _mainMenu.hidden = true
        else
            if ( _settingsHome.visible )
                _mainMenu.hidden = false
    }


    Connections { target: vHDOperationMode
        function onServiceChanged                   ( vValue ) { gotoServiceMode(                         vValue  )}
        function onStandbyWaitDisinfectChanged      ( vValue ) { page( _settingsHome                    , vValue  )}
    }

    onVisibleChanged: {
        if (visible) {
            _mainMenu.hidden = serviceMode
        }
        else {
            stackView.initialItem = null
        }
    }
}
