/*!
 *
 * Copyright (c) 2021-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    PreTreatmentPrimeStack.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      31-Aug-2023
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  01-Mar-2021
 *
 */

// Qt
import QtQuick 2.12

// Project
//  Qml imports
import "qrc:/globals"
import "qrc:/components"
import "qrc:/pages/pretreatment"

/*!
 * \brief   The Pre Tretreatment Prime Stack Screen
 */
StackItem { id: _root
    objectName: "_PreTreatmentPrimeStack"

    stackView.initialItem   : null

    property int stackStepIndex : 4

    signal startPrimeClicked()

    PreTreatmentBase { id: _preTreatmentDrySelfTest
        objectName       :"_preTreatmentDrySelfTest"
        header.confirmVisible   : false // state change is immediate after test completed
        header.confirmEnabled   : vPreTreatmentStates.selfTestDry_complete
        isComplete              : vPreTreatmentStates.selfTestDry_complete
        title.text              : qsTr("Begin Prime")
        completeText            : qsTr("Self Test Complete!")
        // time circle
        hasTimeCircle           : true
        timeCircleMinimum       : 0
        timeCircleMaximum       : vPreTreatmentSelfTestDry.total
        timeCircleProgressValue : vPreTreatmentSelfTestDry.elapsed
        timeCircleTimeTextValue : vPreTreatmentSelfTestDry.remaining * 60

        // chcek list
        hasCheckList            : true
        checkListStepNames      : [
            qsTr("Occlusion Sensor Check"       ),
            qsTr("Cartridge Install Checks"     ),
            qsTr("Pressure Leak Check"          ),
            qsTr("Priming Heparin Line"         ),
            qsTr("Syringe Pump Occlusion Check" ),
        ]
    }

    PreTreatmentBase { id: _preTreatmentDisposablesPrime
        objectName       :"_preTreatmentDisposablesPrime"
        header.confirmVisible   : true
        header.confirmText.text :  qsTr("CONTINUE")
        header.confirmEnabled   : _preTreatmentDisposablesPrime.isComplete
        isComplete              : vPreTreatmentStates.recirculate
        title.text              : qsTr("Priming")
        completeText            : qsTr("Priming Complete!")
        footer {
            childrenCount       : 1 // only one child is visible at a time
            children            : [
                TouchRect { id: _startPrimeButton
                    visible     : ! _preTreatmentDisposablesPrime.isComplete
                    enabled     :   vPreTreatmentStates.prime_waitUserStart
                    width       : parent.spacing
                    text.text   : qsTr("Start  Prime")
                    onClicked   : _root.startPrimeClicked()
                    backgroundColor : Colors.backgroundButtonSelect
                }
                // , // commented out in demo feedback kept if needed to have any other screen later
                // Text { id: _recirculateText
                //     visible     : _preTreatmentDisposablesPrime.isComplete
                //     width       : parent.spacing
                //     height      : _startPrimeButton.height
                //     text        : qsTr("Recirculating ... ")
                //     color       : Colors.textMain
                //     font.pixelSize      : Fonts.fontPixelNotification
                //     horizontalAlignment : Text.AlignHCenter
                //     verticalAlignment   : Text.AlignVCenter
                // }
            ]
        }
        // time circle
        hasTimeCircle           : true
        timeCircleMinimum       : 0
        timeCircleMaximum       : vPreTreatmentDisposablesPrime.total
        timeCircleProgressValue : vPreTreatmentDisposablesPrime.elapsed
        timeCircleTimeTextValue : vPreTreatmentDisposablesPrime.remaining * 60
        // check list
        hasCheckList            : true
        checkListStepNames      : [
            qsTr("Blood Circuit Priming"    ),
            qsTr("Dialysate Circuit Priming"),
            qsTr("Wet Self Tests"           )
        ]
    }

    Connections { target: vPreTreatmentStates
        function onSelfTestDryChanged                               ( vValue ) { page( _preTreatmentDrySelfTest                         , vValue       )}
        function onSelfTestDry_startChanged                         ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(0, true         )}
        function onSelfTestDry_waitDoorCloseChanged                 ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(0, vValue       )}
        function onSelfTestDry_usedCartridgeEntered                 ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(1, true         )}
        function onSelfTestDry_cartridgeLoadedEntered               ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(1, vValue       )}
        function onSelfTestDry_pressureSensorsNormalSetupEntered    ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(2, true         )}
        function onSelfTestDry_pressureSensorsVenousSetupEntered    ( vValue ) {}
        function onSelfTestDry_pressureSensorsVenousEntered         ( vValue ) {}
        function onSelfTestDry_pressureSensorsArterialSetupEntered  ( vValue ) {}
        function onSelfTestDry_pressureSensorsArterialEntered       ( vValue ) {}
        function onSelfTestDry_pressureSensorsDecayEntered          ( vValue ) {}
        function onSelfTestDry_pressureSensorsStabilityEntered      ( vValue ) {}
        function onSelfTestDry_pressureSensorsNormalEntered         ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(2, vValue       )}
        function onSelfTestDry_syringePumpEntered                   ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(3, vValue       )}
        function onSelfTestDry_syringePumpOcclusionDetectionEntered ( vValue ) { _preTreatmentDrySelfTest        .checkList.setItemExt(4, vValue       )}
        function onSelfTestDry_stoppedEntered                       ( vValue ) {}
        function onSelfTestDry_completeEntered                      ( vValue ) {}
    }

    Connections { target: vPreTreatmentStates
        function onPrimeChanged                                     ( vValue ) { page( _preTreatmentDisposablesPrime                 , vValue       )}
        function onPrime_waitUserStartEntered                       ( vValue ) {}
        function onPrime_salineSetupEntered                         ( vValue ) {}
        function onPrime_salinePurgeAirEntered                      ( vValue ) {}
        function onPrime_salineCirculateBloodCircuitEntered         ( vValue ) {}
        function onPrime_reservoirOneFillCompleteEntered            ( vValue ) {}
        function onPrime_dialysateDialyzerEntered                   ( vValue ) {}
        function onPrime_salineDialyzerSetupEntered                 ( vValue ) {}
        function onPrime_salineDialyzerEntered                      ( vValue ) {}
        function onPrime_reservoirTwoFillCompleteEntered            ( vValue ) {}
        function onPrime_dialysateBypassEntered                     ( vValue ) {}
        function onPrime_wetSelfTestsEntered                        ( vValue ) {}
        function onPrime_pauseEntered                               ( vValue ) {}
        function onPrime_completeEntered                            ( vValue ) {}

        //TODO  this way of handling the states are new for states which can reset to the previous states
        // if it is successfull I may use everywhere.
        // 1 - it uses new setItemExt
        // 2 - bundles the states of FW in UI states
        // setitem differences.
        // old:
        // 1 - the start FW state of the UI state set to true
        // 2 - the end FW state fo the UI state set with vValue
        // 3 - nothing for the FW in-states of the UI states
        // new:
        // - all set with vValue and use the  setItemExt
        // Unkown missbehavior:
        // - the only misbehavior is if the FW changes the FW state in the middle (in one of in-states),
        //   since UI budles the FW states, it assumes it is done and checks the state which may not be ideal.
        //   as an example if during the Dyalysate FW changes th state to the pause, UI may not show the Dialysaate done (probably!).
        function onPrime__BloodCircuitEntered                       ( vValue ) { _preTreatmentDisposablesPrime   .checkList.setItemExt(0, vValue    )}
        function onPrime__DialysateCircuitEntered                   ( vValue ) { _preTreatmentDisposablesPrime   .checkList.setItemExt(1, vValue    )}
        function onPrime__WetSelfTestsEntered                       ( vValue ) { _preTreatmentDisposablesPrime   .checkList.setItemExt(2, vValue    )}
    }

    Connections { target: vPreTreatmentAdjustmentDisposablesPrime
        function onAdjustmentTriggered                              ( vValue ) {
            if ( vPreTreatmentAdjustmentDisposablesPrime.adjustment_Accepted ) {
                _preTreatmentDisposablesPrime.reasonText = ""
            } else {
                _preTreatmentDisposablesPrime.reasonText = vPreTreatmentAdjustmentDisposablesPrime.text()
            }
        }
    }

    Connections { target: _preTreatmentDisposablesPrime
        function onConfirmClicked                                   ( vValue ) {
            vPreTreatmentAdjustmentPatientConnectionBegin.doBegin()
        }
    }

    Connections { target: vPreTreatmentAdjustmentPatientConnectionBegin
        function onAdjustmentTriggered                              ( vValue ) {
            if ( vPreTreatmentAdjustmentPatientConnectionBegin.adjustment_Accepted ) {
                _preTreatmentDisposablesPrime.reasonText = ""
            } else {
                _preTreatmentDisposablesPrime.reasonText = vPreTreatmentAdjustmentPatientConnectionBegin.text()
            }
        }
    }

    onStartPrimeClicked: { vPreTreatmentAdjustmentDisposablesPrime.doPrime() }

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