/*!
 *
 * Copyright (c) 2019-2020 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    PostTreatmentMainStack.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      12-Apr-2021
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  12-Apr-2021
 *
 */

// Qt
import QtQuick 2.12

// Project
//  Qml imports
import "qrc:/globals"
import "qrc:/components"
import "qrc:/pages/disinfect"
/*!
 * \brief   the post treatment prime stack screen
 */
StackItem { id: _root
    objectName: "_DisinfectStack"

    stackView.initialItem   : null

    property int stackStepIndex : 1

    signal disinfectSkip             ()
    signal disinfectHeatClicked      ()
    signal disinfectChemicalClicked  ()
    signal disinfectChemicalConfirm  ()

    readonly property string disinfectTitle : qsTr("Disinfection")
    readonly property string flushTitle     : qsTr("Flush")
    readonly property string heatTitle      : qsTr("Heat Disinfect")
    readonly property string chemicalTitle  : qsTr("Chemical Disinfect")

    function doSettingsDisinfect() {
        // since we do't know the order or timing of the FW message
        // prefered to set the screens by UI.
        // If HDOpMode says/has the same state nothing changes, but at least UI is not showing empty screen.
        _mainMenu.hidden = true
        stackView.clear()
        if ( vDisinfectAdjustDisinfect.flush    ) { page( _disinfectFlush               ); return }
        if ( vDisinfectAdjustDisinfect.heat     ) { page( _disinfectHeat                ); return }
        if ( vDisinfectAdjustDisinfect.chemical ) { page( _disinfectChemicalInstruction ); return }
    }

    DisinfectBase { id          :  _disinfect
        objectName              : "_disinfect"
        property int stackStepIndex : 0
        header.stepNames        : [ _root.disinfectTitle ]
        header.confirmVisible   : true
        header.confirmText.text : qsTr("SKIP")
        title.text              : _root.disinfectTitle
        footer.childrenWidth    : 350
        footer.children: [
            TouchRect {
                text.text: _root.heatTitle
                onClicked: _root.disinfectHeatClicked()
            },
            TouchRect {
                text.text: _root.chemicalTitle
                onClicked: _root.disinfectChemicalClicked()
            }
        ]
        onConfirmClicked        : _root.disinfectSkip()
        instructionBased        : true
    }

    DisinfectBase { id          :  _disinfectFlush
        objectName              : "_disinfectFlush"
        header.stepNames        : [ _root.disinfectTitle ,  _root.flushTitle ]
        title.text              :                           _root.flushTitle

        hasCheckList            : true
        isComplete              : vDisinfectStates.flushComplete
        completeText            : qsTr("Water Flush Complete!")
        checkListTimeVisible    : vDisinfectDGData.flushTimeTotal
        checkListTimeSeconds    : vDisinfectDGData.flushTimeRemaining
        checkListStepNames      : [
            qsTr("Drain Device"         ),
            qsTr("Flush Reservoirs"     ),
            qsTr("Drain Reservoirs"     ),
            qsTr("Flush Recirculation"  ),
        ]
    }

    DisinfectBase { id          :  _disinfectHeat
        objectName              : "_disinfectHeat"
        header.stepNames        : [ _root.disinfectTitle ,  _root.heatTitle ]
        title.text              :                           _root.heatTitle

        hasCheckList            : true
        isComplete              : vDisinfectStates.heatComplete
        completeText            : qsTr("Heat Disinfection Complete!")
        checkListTimeVisible    : vDisinfectDGData.heatTimeTotal
        checkListTimeSeconds    : vDisinfectDGData.heatTimeRemaining
        checkListStepNames      : [
            qsTr("Flush Before Disinfect"   ),
            qsTr("Heat Up Water"            ),
            qsTr("Disinfect Reservoir 1"    ),
            qsTr("Transition Hot Water"     ),
            qsTr("Disinfect Reservoir 2"    ),
            qsTr("Cool Down Device"         ),
            qsTr("Flush After Disinfect"    ),
        ]
    }

    DisinfectBase { id          :  _disinfectChemicalInstruction
        objectName              : "_disinfectChemicalInstruction"
        header.stepNames        : [ _root.disinfectTitle ,  _root.chemicalTitle ]
        title.text              :                           _root.chemicalTitle
        header.confirmVisible   : true
        instructionBased        : true
        onConfirmClicked        : _root.disinfectChemicalConfirm()
    }

    DisinfectBase { id          :  _disinfectChemicalProgress
        objectName              : "_disinfectChemicalProgress"
        header.stepNames        : [ _root.disinfectTitle ,  _root.chemicalTitle ]
        title.text              :                           _root.chemicalTitle

        hasCheckList            : true
        isComplete              : vDisinfectStates.chemicalComplete
        completeText            : qsTr("Chemical Disinfection Complete!")
        checkListTimeVisible    : vDisinfectDGData.chemicalTimeTotal
        checkListTimeSeconds    : vDisinfectDGData.chemicalTimeRemaining
        checkListStepNames      : [
            qsTr("Flush Before Disinfect"   ),
            qsTr("Mix water And Acid"       ),
            qsTr("Remove Acid"              ),
            qsTr("Disinfect Device"         ),
            qsTr("Flush After Disinfect"    ),
        ]
    }

    // ----- Checkmarks
    Connections { target: vDisinfectStates
        onFlushNotRunningEntered                : { }
        onFlushDrainBeforeFlushEntered          : { _disinfectFlush             .checkList.setItem(0, vflushDrainBeforeFlush        )}
        onFlushFlushReservoirsEntered           : { _disinfectFlush             .checkList.setItem(1, vflushFlushReservoirs         )}
        onFlushDrainReservoirsEntered           : { _disinfectFlush             .checkList.setItem(2, vflushDrainReservoirs         )}
        onFlushRecirculatePathEntered           : { _disinfectFlush             .checkList.setItem(3, vflushRecirculatePath         )}
        onFlushCancelEntered                    : { }
        onFlushCompleteEntered                  : { }

        onHeatNotRunningEntered                 : { }
        onHeatFlushBeforeDisinfectEntered       : { _disinfectHeat              .checkList.setItem(0, vheatFlushBeforeDisinfect     )}
        onHeatWaterHeatUpEntered                : { _disinfectHeat              .checkList.setItem(1, vheatWaterHeatUp              )}
        onHeatDisinfectR1Entered                : { _disinfectHeat              .checkList.setItem(2, vheatDisinfectR1              )}
        onHeatTransitionHotWaterEntered         : { _disinfectHeat              .checkList.setItem(3, vheatTransitionHotWater       )}
        onHeatDisinfectR2Entered                : { _disinfectHeat              .checkList.setItem(4, vheatDisinfectR2              )}
        onHeatDeviceCoolDownEntered             : { _disinfectHeat              .checkList.setItem(5, vheatDeviceCoolDown           )}
        onHeatFlushAfterDisinfectEntered        : { _disinfectHeat              .checkList.setItem(6, vheatFlushAfterDisinfect      )}
        onHeatCancelEntered                     : { }
        onHeatCompleteEntered                   : { }

        onChemicalNotRunningEntered             : { }
        onChemicalFlushBeforeDisinfectEntered   : { _disinfectChemicalProgress .checkList.setItem(0, vchemicalFlushBeforeDisinfect  )}
        onChemicalMixWaterAndAcidEntered        : { _disinfectChemicalProgress .checkList.setItem(1, vchemicalMixWaterAndAcid       )}
        onChemicalRemoveAcidEntered             : { _disinfectChemicalProgress .checkList.setItem(2, vchemicalRemoveAcid            )}
        onChemicalDisinfectEntered              : { _disinfectChemicalProgress .checkList.setItem(3, vchemicalDisinfect             )}
        onChemicalFlushAfterDisinfectEntered    : { _disinfectChemicalProgress .checkList.setItem(4, vchemicalFlushAfterDisinfect   )}
        onChemicalCancelEntered                 : { }
        onChemicalCompleteEntered               : { }
    }
    // ----- Commands
    onDisinfectSkip                         : { vDisinfectAdjustDisinfect      .doFlush            (            )}
    onDisinfectHeatClicked                  : { vDisinfectAdjustDisinfect      .doDisinfectHeat    (            )}
    onDisinfectChemicalClicked              : { vDisinfectAdjustDisinfect      .doDisinfectChemical(            )}
    onDisinfectChemicalConfirm              : { vDisinfectAdjustChemicalConfirm.doConfirm          (            )}

    // ------ Navigations
    Connections { target: vPostTreatmentStates
        onPatientDisconnectionChanged       : { console.debug("patientDisconnection", vpatientDisconnection     )}
        onDrainReservoirsChanged            : { console.debug("drainReservoirs     ", vdrainReservoirs          )}
        onVerifyChanged                     : { console.debug("verify              ", vverify                   )}
    }

    Connections { target: vHDOperationMode
        onStandbyWaitDisinfectChanged       : { page( _disinfect                 , vstandbyWaitDisinfect        )} // initialItem
        onStandbyDGFlushChanged             : { page( _disinfectFlush            , vstandbyDGFlush              )}
        onStandbyDGDisinfectHeatChanged     : { page( _disinfectHeat             , vstandbyDGDisinfectHeat      )}
        onStandbyDGDisinfectChemicalChanged : { page( _disinfectChemicalProgress , vstandbyDGDisinfectChemical  )}
    }

    // ----- Responses
    Connections { target:  vDisinfectAdjustDisinfect
        onAdjustmentTriggered   : {
            if ( vDisinfectAdjustDisinfect.adjustment_Accepted ) {
                _disinfect.reasonText = ""
                if ( vDisinfectAdjustDisinfect.chemical )
                    page( _disinfectChemicalInstruction )
            } else {
                _disinfect.reasonText = vDisinfectAdjustDisinfect.text()
            }
        }
    }

    Connections { target: vDisinfectAdjustChemicalConfirm
        onAdjustmentTriggered   : {
            if ( vDisinfectAdjustChemicalConfirm.adjustment_Accepted ) {
                _disinfectChemicalInstruction.reasonText = ""
            } else {
                _disinfectChemicalInstruction.reasonText = vDisinfectAdjustChemicalConfirm.text()
            }
        }
    }

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