/*!
 *
 * Copyright (c) 2019-2024 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)      10-Jul-2024
 * \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 VTDAirBubble                                         0.1
import VTDAirPump                                           0.1
import VTDAirTrap                                           0.1
import VTDVoltage                                           0.1
import VTDValves                                            0.1
import VTDBattery                                           0.1
import VTDSwitches                                          0.1
import VTDEjector                                           0.1
import VTDTemperature                                       0.1
// POST
import VHDPOSTData                                          0.1
import VDGPOSTData                                          0.1

// Device
import VDevice                                              0.1

// Settings
import VSettings                                            0.1
import VLocalization                                        0.1
import VAdjustmentVersions                                  0.1
import VAdjustmentServiceMode                               0.1
import VAdjustmentServiceDates                              0.1
import VDateTime                                            0.1
import VAdjustmentAlarmVolume                               0.1
import VBluetooth                                           0.1
import VDuetRoWaterDG                                       0.1
import VCloudSync                                           0.1
import VHDUsageInfo                                         0.1
import VAdjustmentInstitutionalRecord                       0.1
// States views
import VTDOpMode                                            0.1 //// ----- @LEAHIZED
import VPreTreatmentStates                                  0.1
import VTDTreatmentStates                                   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 VTreatmentParametersSetPoint                         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 VDDHeaters                                           0.1
import VDGLoadCellReadings                                  0.1
import VDGOperationMode                                     0.1
import VDDPressures                                         0.1
import VDGROPump                                            0.1
import VDGReservoir                                         0.1
import VDDConcentratePump                                   0.1
import VDDTemperatures                                      0.1
import VDDDialysatePump                                     0.1
import VDDValvesStates                                      0.1
import VTreatmentCreate                                     0.1
import VDGAccelerometer                                     0.1
import VDDConductivity                                      0.1
import VDDGenDialysate                                      0.1
import VDDLevel                                             0.1
import VDDBloodLeak                                         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"
import "qrc:/dialogs/diagnostics"

/*!
 * \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                                             }
    VLocalization                                       { id: vLocalization                                         }
    VAdjustmentVersions                                 { id: vAdjustmentVersions                                   }
    VAdjustmentServiceMode                              { id: vAdjustmentServiceMode                                }
    VAdjustmentServiceDates                             { id: vAdjustmentServiceDates                               }
    VDateTime                                           { id: vDateTime                                             }
    VAdjustmentAlarmVolume                              { id: vAdjustmentAlarmVolume                                }
    VBluetooth                                          { id: vBluetooth                                            }
    VDuetRoWaterDG                                      { id: vDuetRoWaterDG                                        }
    VCloudSync                                          { id: vCloudSync                                            }
    VHDUsageInfo                                        { id: vHDUsageInfo                                          }
    VAdjustmentInstitutionalRecord                      { id: vAdjustmentInstitutionalRecord                        }
    //VAdjustIn
    // ---- States
    VTDOpMode                                    { id: vTDOpMode
        onStandbyChanged: {
            if(vTDOpMode.standby) {
                vTreatmentVitals.doReset()
            }
        }
    }
    VPreTreatmentStates                                 { id: vPreTreatmentStates                                   }
    VTDTreatmentStates                                  { id: vTDTreatmentStates                                    }
    VPostTreatmentStates                                { id: vPostTreatmentStates                                  }

    VTreatmentBloodFlow                                 { id: vTreatmentBloodFlow                                   }
    VTreatmentVitals                                    { id: vTreatmentVitals
        interval    : vTreatmentCreate.bloodPressureMeasureInterval
        enableDialog:  vTDOpMode.inTreatment && vTDTreatmentStates.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                                        }
    VTDAirBubble                                        { id: vTDAirBubble                                          }
    VTDAirPump                                          { id: vTDAirPump                                            }
    VHDBloodLeak                                        { id: vHDBloodLeak                                          }
    VTDAirTrap                                          { id: vTDAirTrap                                            }
    VTDVoltage                                          { id: vTDVoltage                                            }
    VTDValves                                           { id: vTDValves                                             }
    VTDBattery                                          { id: vTDBattery                                            }
    VTDSwitches                                         { id: vTDSwitches                                           }
    VTDEjector                                          { id: vTDEjector                                            }
    VTDTemperature                                      { id: vTDTemperature                                        }

    VTreatmentDialysateFlow                             { id: vTreatmentDialysateFlow                               }
    VTreatmentPressureOcclusion                         { id: vTreatmentPressureOcclusion                           }
    VTreatmentUltrafiltration                           { id: vTreatmentUltrafiltration                             }
    VTreatmentTime                                      { id: vTreatmentTime                                        }
    VTreatmentParametersSetPoint                        { id: vTreatmentParametersSetPoint                          }
    VTreatmentBloodPrime                                { id: vTreatmentBloodPrime                                  }
    VTreatmentRinseback                                 { id: vTreatmentRinseback                                   }
    VTreatmentRecirculate                               { id: vTreatmentRecirculate                                 }
    VTreatmentStop                                      { id: vTreatmentStop                                        }
    // ---- DG
    VDGDrainPump                                        { id: vDGDrainPump                                          }
    VDDHeaters                                          { id: vDDHeaters                                            }
    VDGLoadCellReadings                                 { id: vDGLoadCellReadings                                   }
    VDGOperationMode                                    { id: vDGOperationMode                                      }
    VDDPressures                                        { id: vDDPressures                                          }
    VDGROPump                                           { id: vDGROPump                                             }
    VDGReservoir                                        { id: vDGReservoir                                          }
    VDDConcentratePump                                  { id: vDDConcentratePump                                    }
    VDDTemperatures                                     { id: vDDTemperatures                                       }
    VDDDialysatePump                                    { id: vDDDialysatePump                                      }
    VDDValvesStates                                     { id: vDDValvesStates                                       }
    VDGAccelerometer                                    { id: vDGAccelerometer                                      }
    VDDConductivity                                     { id: vDDConductivity                                       }
    VDDGenDialysate                                     { id: vDDGenDialysate                                       }
    VDDLevel                                            { id: vDDLevel                                              }
    VDDBloodLeak                                        { id: vDDBloodLeak                                          }
    // --- 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 } // FIXME: BEHROUZ - anchors.top : _headerbar.bottom or add topMargin to all stacks
    // 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("Prescriptions") , qsTr("Settings") ]
        visibleItems            : [       true        ,       true            ,       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: vTDOpMode
        function onStandbyWaitDisinfectChanged  ( vValue ) { _mainMenu.isTreatment() }
    }

    // 9 - Others
    Rectangle { //TODO:@LEAHI: make this the statusbar/headerbar component.
        anchors.top: parent.top
        width   : Variables.applicationWidth
        height  : Variables.notificationHeight
        color   : _mainStack.currentScreen.objectName === 'TreatmentStack' ? "transparent" :    // FIXME: BEHROUZ - My workaround for showing the top main treatment menu with headerbar
                                                                       Colors.backgroundMainMenu
        gradient: Gradient { //TODO:@LEAHI: make this a component.
            GradientStop { position: 0.2; color: Qt.lighter(Colors.backgroundMain, 1.2) }
            GradientStop { position: 0.8; color: Qt.darker (Colors.backgroundMain, 1.2) }
        }

        Item {
            width   : Variables.headerBarDateTimeWidth
            anchors {
                top     : parent.top
                left    : parent.left
                bottom  : parent.bottom
                margins : 10
            }
            Column {
                spacing : 0
                anchors.fill: parent
                Text {
                    color   : Colors.textMain
                    width   : parent.width
                    height  : parent.height * 3/5
                    horizontalAlignment : Text.AlignHCenter
                    verticalAlignment   : Text.AlignVCenter
                    text    : vDateTime.time
                    font.pixelSize: 40
                }
                Text {
                    color   : Colors.textMain
                    width   : parent.width
                    height  : parent.height * 2/5
                    horizontalAlignment : Text.AlignHCenter
                    verticalAlignment   : Text.AlignVCenter
                    text    : vDateTime.date
                    font.pixelSize: 25
                }
            }
        }
        Text { // TEST : Application version should be moved into the information screen later.
            color   : Colors.textMain
            anchors {
                top         : parent.top
                left        : parent.left
                leftMargin : 100

            }
            horizontalAlignment : Text.AlignRight
            verticalAlignment   : Text.AlignBottom

            height  : 15
            text    : Qt.application.version //DEBUG: + "[" + _GuiView.platform + "]"
            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 // ===================== Device Controller: FIXME
            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 // ===================== Device Controller: FIXME
            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 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    : vTDOpMode.fault
        z                   : 995
    }

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