/*!
 *
 * Copyright (c) 2019-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    main.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      11-Sep-2023
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  24-Sep-2019
 *
 */

// Qt
import QtQuick 2.12

// Project
//  C++ imports
import Gui.View                                             0.1
import Gui.Actions                                          0.1

// View classes
import VGeneralEvent                                        0.1
import VHDAccelerometer                                     0.1
import VHDSyringePump                                       0.1
import VHDBloodLeak                                         0.1
import VHDAirTrap                                           0.1
import VHDAirBubble                                         0.1
// POST
import VHDPOSTData                                          0.1
import VDGPOSTData                                          0.1

// Device
import VDevice                                              0.1

// Settings
import VSettings                                            0.1
import VAdjustmentVersions                                  0.1
import VAdjustmentServiceMode                               0.1
import VAdjustmentServiceDates                              0.1
import VDateTime                                            0.1
import VNetworkModel                                        0.1
import VAdjustmentAlarmVolume                               0.1
import VBluetooth                                           0.1
import VDuetRoWaterDG                                       0.1
import VCloudSync                                           0.1
import VHDUsageInfo                                         0.1
// States views
import VHDOperationMode                                     0.1
import VPreTreatmentStates                                  0.1
import VHDTreatmentStates                                   0.1
import VPostTreatmentStates                                 0.1

// Treatment - Common
import VTreatmentVitals                                     0.1
// In-Treatment - Data
import VTreatmentBloodFlow                                  0.1
import VTreatmentDialysateFlow                              0.1
import VTreatmentPressureOcclusion                          0.1
import VTreatmentUltrafiltration                            0.1
import VTreatmentTime                                       0.1
import VTreatmentRinseback                                  0.1
import VTreatmentRecirculate                                0.1
import VTreatmentBloodPrime                                 0.1
import VTreatmentStop                                       0.1
import VTreatmentRanges                                     0.1
// Pre-Treatment
import VPreTreatmentAdjustmentInitTreatment                 0.1
import VDGFilterFlush                                       0.1
import VPreTreatmentAdjustmentWaterSample                   0.1
import VPreTreatmentAdjustmentConsumablesConfirm            0.1
import VPreTreatmentSelfTestNoCartridge                     0.1
import VPreTreatmentAdjustmentDisposablesConfirm            0.1
import VPreTreatmentSelfTestDry                             0.1
import VPreTreatmentAdjustmentDisposablesPrime              0.1
import VPreTreatmentDisposablesPrime                        0.1
import VPreTreatmentAdjustmentPatientConnectionBegin        0.1
import VPreTreatmentAdjustmentUltrafiltrationInit           0.1
import VPreTreatmentAdjustmentPatientConnectionConfirm      0.1
import VPreTreatmentAdjustmentStartTreatment                0.1
// ---
import VDGDrainPump                                         0.1
import VDGHeaters                                           0.1
import VDGLoadCellReadings                                  0.1
import VDGOperationMode                                     0.1
import VDGPressures                                         0.1
import VDGROPump                                            0.1
import VDGReservoir                                         0.1
import VDGTemperatures                                      0.1
import VDGValvesStates                                      0.1
import VTreatmentCreate                                     0.1
import VDGAccelerometer                                     0.1
import VDGConductivity                                      0.1
// In-Treatment - Adjustemnt
import VTreatmentAdjustmentDuration                         0.1
import VTreatmentAdjustmentFlows                            0.1
import VTreatmentAdjustmentUltrafiltrationState             0.1
import VTreatmentAdjustmentUltrafiltrationEdit              0.1
import VTreatmentAdjustmentUltrafiltrationConfirm           0.1
import VTreatmentAdjustmentPressuresLimits                  0.1
import VTreatmentAdjustmentSaline                           0.1
import VTreatmentAdjustmentHeparin                          0.1
import VTreatmentAdjustmentRinseback                        0.1
import VTreatmentAdjustmentRecirculate                      0.1
import VTreatmentAdjustmentEnd                              0.1
// Post-Treatmnt
import VPostTreatmentAdjustmentPatientDisconnectionConfirm  0.1
import VPostTreatmentAdjustmentDisposablesRemovalConfirm    0.1
import VPostTreatmentAdjustmentTreatmentLog                 0.1
// Disinfection
import VDisinfectAdjustDisinfect                            0.1
import VAdjustDGCleaningUsage                               0.1

// Confirm
import VConfirm     0.1

//  Qml imports
import "qrc:/globals"
import "qrc:/pages"
import "qrc:/pages/treatment"
import "qrc:/pages/settings"
import "qrc:/components"
import "qrc:/dialogs"

/*!
 * \brief   Initialization and start point of the QML
 */
Item { id : _mainItem
    width : Variables.applicationWidth
    height: Variables.applicationHeight

    VConfirm                                            { id: vConfirm                                              }

    VHDPOSTData                                         { id: vHDPOSTData                                           }
    VDGPOSTData                                         { id: vDGPOSTData                                           }

    VDevice                                             { id: vDevice                                               }
    VSettings                                           { id: vSettings                                             }
    VAdjustmentVersions                                 { id: vAdjustmentVersions                                   }
    VAdjustmentServiceMode                              { id: vAdjustmentServiceMode                                }
    VAdjustmentServiceDates                             { id: vAdjustmentServiceDates                               }
    VDateTime                                           { id: vDateTime                                             }
    VNetworkModel                                       { id: vNetwork                                              }
    VAdjustmentAlarmVolume                              { id: vAdjustmentAlarmVolume                                }
    VBluetooth                                          { id: vBluetooth                                            }
    VDuetRoWaterDG                                      { id: vDuetRoWaterDG                                        }
    VCloudSync                                          { id: vCloudSync                                            }
    VHDUsageInfo                                        { id: vHDUsageInfo                                          }
    // ---- States
    VHDOperationMode                                    { id: vHDOperationMode
        onStandbyChanged: {
            if(vHDOperationMode.standby) {
                vTreatmentVitals.doReset()
            }
        }
    }
    VPreTreatmentStates                                 { id: vPreTreatmentStates                                   }
    VHDTreatmentStates                                  { id: vHDTreatmentStates                                    }
    VPostTreatmentStates                                { id: vPostTreatmentStates                                  }

    VTreatmentBloodFlow                                 { id: vTreatmentBloodFlow                                   }
    VTreatmentVitals                                    { id: vTreatmentVitals
        interval    : vTreatmentCreate.bloodPressureMeasureInterval
        enableDialog:  vHDOperationMode.inTreatment && vHDTreatmentStates.txTreatment
        // As long as UI is in In-Tx BP/HR is updated and the dialog will pop up on interval.
        onEnableDialogChanged : {
            if ( vTreatmentVitals.enableDialog ) {
                vTreatmentVitals.doTimerStart()
            }
            else {
                vTreatmentVitals.doTimerStop()
            }
        }
    }

    VGeneralEvent                                       { id: vGeneralEvent                                         }
    VHDAccelerometer                                    { id: vHDAccelerometer                                      }
    VHDSyringePump                                      { id: vHDSyringePump                                        }
    VHDAirBubble                                        { id: vHDAirBubble                                          }
    VHDBloodLeak                                        { id: vHDBloodLeak                                          }
    VHDAirTrap                                          { id: vHDAirTrap                                            }

    VTreatmentDialysateFlow                             { id: vTreatmentDialysateFlow                               }
    VTreatmentPressureOcclusion                         { id: vTreatmentPressureOcclusion                           }
    VTreatmentUltrafiltration                           { id: vTreatmentUltrafiltration                             }
    VTreatmentTime                                      { id: vTreatmentTime                                        }
    VTreatmentBloodPrime                                { id: vTreatmentBloodPrime                                  }
    VTreatmentRinseback                                 { id: vTreatmentRinseback                                   }
    VTreatmentRecirculate                               { id: vTreatmentRecirculate                                 }
    VTreatmentStop                                      { id: vTreatmentStop                                        }
    // ---- DG
    VDGDrainPump                                        { id: vDGDrainPump                                          }
    VDGHeaters                                          { id: vDGHeaters                                            }
    VDGLoadCellReadings                                 { id: vDGLoadCellReadings                                   }
    VDGOperationMode                                    { id: vDGOperationMode                                      }
    VDGPressures                                        { id: vDGPressures                                          }
    VDGROPump                                           { id: vDGROPump                                             }
    VDGReservoir                                        { id: vDGReservoir                                          }
    VDGTemperatures                                     { id: vDGTemperatures                                       }
    VDGValvesStates                                     { id: vDGValvesStates                                       }
    VDGAccelerometer                                    { id: vDGAccelerometer                                      }
    VDGConductivity                                     { id: vDGConductivity                                       }
    // --- Pre-Treatment Progress Data
    VPreTreatmentAdjustmentInitTreatment                { id: vPreTreatmentAdjustmentInitTreatment                  }
    VDGFilterFlush                                      { id: vDGFilterFlush                                        }
    VPreTreatmentAdjustmentWaterSample                  { id: vPreTreatmentAdjustmentWaterSample                    }
    VPreTreatmentAdjustmentConsumablesConfirm           { id: vPreTreatmentAdjustmentConsumablesConfirm             }
    VPreTreatmentSelfTestNoCartridge                    { id: vPreTreatmentSelfTestNoCartridge                      }
    VPreTreatmentAdjustmentDisposablesConfirm           { id: vPreTreatmentAdjustmentDisposablesConfirm             }
    VPreTreatmentSelfTestDry                            { id: vPreTreatmentSelfTestDry                              }
    VPreTreatmentAdjustmentDisposablesPrime             { id: vPreTreatmentAdjustmentDisposablesPrime               }
    VPreTreatmentDisposablesPrime                       { id: vPreTreatmentDisposablesPrime                         }
    VPreTreatmentAdjustmentPatientConnectionBegin       { id: vPreTreatmentAdjustmentPatientConnectionBegin         }
    VPreTreatmentAdjustmentUltrafiltrationInit          { id: vPreTreatmentAdjustmentUltrafiltrationInit            }
    VPreTreatmentAdjustmentPatientConnectionConfirm     { id: vPreTreatmentAdjustmentPatientConnectionConfirm       }
    VPreTreatmentAdjustmentStartTreatment               { id: vPreTreatmentAdjustmentStartTreatment                 }

    // ---
    VTreatmentAdjustmentDuration                        { id: vTreatmentAdjustmentDuration                          }
    VTreatmentAdjustmentFlows                           { id: vTreatmentAdjustmentFlows                             }
    VTreatmentCreate                                    { id: vTreatmentCreate                                      }

    VTreatmentRanges                                    { id: vTreatmentRanges                                      }
    VTreatmentAdjustmentSaline                          { id: vTreatmentAdjustmentSaline                            }
    VTreatmentAdjustmentUltrafiltrationState            { id: vTreatmentAdjustmentUltrafiltrationState              }
    VTreatmentAdjustmentUltrafiltrationEdit             { id: vTreatmentAdjustmentUltrafiltrationEdit               }
    VTreatmentAdjustmentUltrafiltrationConfirm          { id: vTreatmentAdjustmentUltrafiltrationConfirm            }
    VTreatmentAdjustmentPressuresLimits                 { id: vTreatmentAdjustmentPressuresLimits                   }
    VTreatmentAdjustmentHeparin                         { id: vTreatmentAdjustmentHeparin                           }
    VTreatmentAdjustmentRinseback                       { id: vTreatmentAdjustmentRinseback                         }
    VTreatmentAdjustmentRecirculate                     { id: vTreatmentAdjustmentRecirculate                       }
    VTreatmentAdjustmentEnd                             { id: vTreatmentAdjustmentEnd                               }

    // --- Post Treatment
    VPostTreatmentAdjustmentPatientDisconnectionConfirm { id: vPostTreatmentAdjustmentPatientDisconnectionConfirm   }
    VPostTreatmentAdjustmentDisposablesRemovalConfirm   { id: vPostTreatmentAdjustmentDisposablesRemovalConfirm     }
    VPostTreatmentAdjustmentTreatmentLog                { id: vPostTreatmentAdjustmentTreatmentLog                  }

    // --- Disinfection
    VDisinfectAdjustDisinfect                           { id: vDisinfectAdjustDisinfect                             }
    VAdjustDGCleaningUsage                              { id: vAdjustDGCleaningUsage                                }

    Background {}

    // ----- Follow the below Z order -----
    // 1 - Screens
    // 1 - 1
    SettingsStack { id: _settingsStack }
    // 1 - 2
    ManagerStack  { id: _managerStack  }
    // 1 - 3
    MainStack     { id: _mainStack     }

    // 3 - Footer
    MainMenu { id: _mainMenu
        function isTreatment  () { _mainMenu.itemPressed(0) }
        function isManager    () { _mainMenu.itemPressed(1) }
        function isSettings   () { _mainMenu.itemPressed(2) }

        disable                 : _GuiView.manufactSetup || _GuiView.updateSetup
        hidden                  : true // it should be hidden by default since the landing screen changed to init and it does not have the main menu until the POST passes.
        titles                  : [ qsTr("Treatment") , qsTr("Manager") , qsTr("Settings") ]
        visibleItems            : [       true        ,       false     ,       true       ]
        Component.onCompleted   : {
            _settingsStack.visible = false
            _managerStack .visible = false
            _mainStack    .visible = true
        }

        onItemPressed: {
            if ( disable ) return
            _mainStack    .visible = vIndex == 0
            _managerStack .visible = vIndex == 1
            _settingsStack.visible = vIndex == 2
        }
    }

    Connections { target: vHDOperationMode
        function onStandbyWaitDisinfectChanged  ( vValue ) { _mainMenu.isTreatment() }
    }

    // 9 - Others
    Text { // TEST : Application version should be moved into the information screen later.
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin : 10
        }
        horizontalAlignment : Text.AlignRight
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : Qt.application.version
        font.pixelSize: 14
    }

    Text { // TEST : Wireless IP
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 325
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : "W:" + vNetwork.wirelessIP
        font.pixelSize: 15
    }

    Text { // TEST : Ethernet IP
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 475
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : "E:" + vNetwork.ethernetIP
        font.pixelSize: 15
    }

    Text { // TEST : BluetoothStatus
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 615
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : "B:" + vBluetooth.pairedAddr
        font.pixelSize: 14
    }

    Text { // TEST : The treatment vital dialog countdown time
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 900
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        //DEBUG text    : "Vital Timer: " + vTreatmentVitals.min_left + " : " + vTreatmentVitals.sec_left
        font.pixelSize: 14
    }

    Text { // TEST : Current Date/Time
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 1080
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : vDateTime.current
        font.pixelSize: 14
    }

    Text { // TEST : Current timezone
        color   : Colors.textMain
        anchors {
            top         : parent.top
            left        : parent.left
            leftMargin  : 1220
        }
        horizontalAlignment : Text.Alignleft
        verticalAlignment   : Text.AlignBottom

        height  : 15
        text    : vDateTime.timezone
        font.pixelSize: 14
    }

    SDCProgressItem              { id: _sdcProgressItem
        // TODO: disable this later. this is only for diagnostic purpose.
        onDoubleClicked : {
            if ( _GuiView.dryDemoMode ) {
                let dryDemoTempID = 99
                let id = vConfirm.id
                vConfirm.id = dryDemoTempID
                vConfirm.doConfirm( true  )
                vConfirm.id = id
            }
            else {
                _diagnosticsDialog.open()
            }
        }
    }

    // keyboard should always be before AlarmItem to not to covet it.
    KeyboardItem        { id: _keyboard                    }

    AlarmItem           { id: _alarmItem        ;   z: 996 }
    PowerItem           { id: _powerItem        ;   z: 997 }
    ConfirmDialog       { id: _confirmDialog    ;   z: 998 }
    DiagnosticsDialog   { id: _diagnosticsDialog;   z: 999 }

    // Note: NotificationBar has to be anchored to the main menu and if it is moved into the AlarmItem
    //       then cannot be anchored.
    NotificationBar     { id: _alarmBar
        anchors.bottom      : _mainMenu.top
        backgroundColor     : _alarmItem.backgroundColor
        textColor           : _alarmItem.textColor
        alarmID             : _alarmItem.alarm_AlarmID
        text                : _alarmItem.title
        textPixelSize       : Fonts.fontPixelAlarmBarTitle
        isSilenced          : _alarmItem.isSilenced
        timeout             : _alarmItem.timeout
        backgroundFading    : vHDOperationMode.fault
    }

    GuiView { id: _GuiView
//        Component.onCompleted: {
//            console.debug("GuiView - complete")
//        }
    }
}
