/*!
 *
 * 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)      23-Nov-2022
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  16-Apr-2021
 *
 */

// Qt
import QtQuick                  2.12

// 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      ,
        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("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
        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
        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

            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
    }

    UserConfirmation            { id: _servicePassword
        itemIndex : SettingsStack.Services
        title     : qsTr("Service Password")
        isPassword: true
        onBackClicked   : {
            clearPassword()
            _settingsHome.notificationText = ""
        }
        onConfirmClicked: {
            if ( vSettings.servicePass === "" ) {
                _settingsHome.notificationText = qsTr("No service password defined")
            }
            else {
                if ( password === vSettings.servicePass ) {
                    _settingsHome.notificationText = ""
                    vAdjustmentServiceMode.doAdjustment()
                    if ( vSettings.noCANBus ) { // if NoCANBus is set don't wait for HD and go to service mode.
                        gotoServiceMode(true)
                    }
                }
                else {
                    _settingsHome.notificationText = qsTr("Incorrect service password")
                }
            }
            clearPassword()
            pop()
        }
    }

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

    function gotoServiceMode( vservice ) {
//        push( _settingsHome , vservice )
        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
        }
    }
}
