/*!
 *
 * 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 VInstitutionalRecord                                 0.1
import VAdjustmentInstitutionalRecord                       0.1
import VAdvancedInstitutionalRecord                         0.1
import VAdjustmentAdvancedInstitutionalRecord               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
// FP Data
import VFPValvesStates                                      0.1
import VFPROPump                                            0.1
import VFPPressures                                         0.1
import VFPLevel                                             0.1
import VFPFlow                                              0.1
import VFPConductivity                                      0.1
import VFPTemperature                                       0.1
import VFPBoostPump                                         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 VTreatmentAdjustmentVitals                           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/treatment/adjustments"
import "qrc:/pages/settings"
import "qrc:/components"
import "qrc:/dialogs"
import "qrc:/dialogs/diagnostics"
import "qrc:/dialogs/headerbar"

/*!
 * \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                        }
    VInstitutionalRecord                                { id: vInstitutionalRecord                                  }
    VAdjustmentAdvancedInstitutionalRecord              { id: vAdjustmentAdvancedInstitutionalRecord                }
    VAdvancedInstitutionalRecord                        { id: vAdvancedInstitutionalRecord                          }
    //VAdjustIn
    // ---- States
    VTDOpMode                                    { id: vTDOpMode
        onStandbyChanged: {
            if(vTDOpMode.standby) {
                vTreatmentVitals.doReset()
                vTreatmentCreate.txCode = ""
                vTreatmentCreate.parametersValidated = false
                vTreatmentCreate.parametersConfirmed = false
            }
        }
    }
    VPreTreatmentStates                                 { id: vPreTreatmentStates                                   }
    VTDTreatmentStates                                  { id: vTDTreatmentStates                                    }
    VPostTreatmentStates                                { id: vPostTreatmentStates                                  }

    VTreatmentBloodFlow                                 { id: vTreatmentBloodFlow                                   }
    VTreatmentVitals                                    { id: vTreatmentVitals
        interval        : vTreatmentCreate.bloodPressureMeasureInterval
        canStartInterval: vTDOpMode.inTreatment && vTDTreatmentStates.txTreatment
        enableBPCuff    : true  // TODO: PRS 343 update with enable/disable Integrated Blood Pressure Cuff
        onCanStartIntervalChanged : {
            if ( vTreatmentVitals.canStartInterval )    { 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                                        }
    // ---- DD
    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                                          }
    // --- FP Data
    VFPValvesStates                                     { id: vFPValvesStates                                       }
    VFPROPump                                           { id: vFPROPump                                             }
    VFPPressures                                        { id: vFPPressures                                          }
    VFPLevel                                            { id: vFPLevel                                              }
    VFPFlow                                             { id: vFPFlow                                               }
    VFPConductivity                                     { id: vFPConductivity                                       }
    VFPTemperature                                      { id: vFPTemperature                                        }
    VFPBoostPump                                        { id: vFPBoostPump                                          }
    // --- 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                            }
    VTreatmentAdjustmentVitals                          { id: vTreatmentAdjustmentVitals                            }
    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 -----
    Item { id: _mainContent
        anchors.top: _headerBar.bottom

        // 1 - Screens
        // 1 - 1
        SettingsStack { id: _settingsStack  }
        // 1 - 2
        ManagerStack  { id: _managerStack   }
        // 1 - 3
        MainStack     { id: _mainStack      }
    }

    // 3 - Footer
    MainMenu { id: _mainMenu
        anchors.bottom      : parent.bottom
        anchors.bottomMargin: hidden || disable ? height * -1 : 0

        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.
        width                   : Variables.applicationWidth
        isMainMenu              : true

        Component.onCompleted   : {
            _settingsStack.visible = false
            _managerStack .visible = false
            _mainStack    .visible = true
        }

        onItemPressed: function (vIndex) {
            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
    HeaderBar { id: _headerBar
        anchors.top: parent.top
    }

    GuiView { id: _GuiView
        //        Component.onCompleted: {
        //            console.debug("GuiView - complete")
        //        }
    }
    // keyboard should always be before AlarmItem to not to covet it.
    KeyboardItem                { id: _keyboard                    }

    // Dialogs
    AcidConcentrateAdjustment   { id: _acidConcentrateAdjustment   }
    HeaderbarPrescription       { id: _headerbarPrescription       }
    HeaderbarWiFi               { id: _headerbarWifi               }
    HeaderbarStorage            { id: _headerbarStorage            }
    HeaderbarSettings           { id: _headerbarSettings           }
    HeaderbarInformation        { id: _headerbarInformation        }
    TreatmentAdjustmentVitals   { id: _treatmentAdjustmentVitals    }
    LockDialog                  { id: _lockDialog                  }
    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
        color               : _alarmItem.backgroundColor
        textColor           : _alarmItem.textColor
        alarmID             : _alarmItem.alarm_AlarmID
        text                : _alarmItem.title
        textPixelSize       : Fonts.fontPixelAlarmBarTitle
        isSilenced          : _alarmItem.isSilenced
        timeout             : _alarmItem.timeout
        z                   : 995
    }
}
