/*!
 *
 * 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    PreTreatmentStack.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      02-Feb-2023
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  21-Jun-2021
 *
 */

// Qt
import QtQuick 2.12

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

/*!
 * \brief   the pre treatment stack screen
 */
StackItem { id: _root
    stackView.initialItem   :  null

    enum Step {
        Concentrates    ,
        Installation    ,
        SelfTests       ,
        Saline          ,
        Prime           ,
        WaterSample     ,
        CreateRx        ,
        DialysateUF     ,
        Connect
    }

    property var stepNames              : [] // step name parallel list
    property var stepKeys               : [] // step enum parallel list
    property int stackStepIndex         : 0
    readonly property bool isCreateRx   : stepKeys[_root.stackStepIndex] === PreTreatmentStack.Step.CreateRx
    readonly property bool isDialysteUf : stepKeys[_root.stackStepIndex] === PreTreatmentStack.Step.DialysateUF

    // testing defeature... update later
    property bool enableWaterSample     : true

    onVisibleChanged: {
        if (visible) {
            rebuildMap()
            _mainMenu.hidden = true
            _headerBar.titleText = qsTr("Setup Treatment")
            _root.stackStepIndex = 0
        }
        else {
            stackView.initialItem = null
            _headerBar.titleText = ""
        }
    }

    // dynamically rebuild map 🗺️ when entering pretreatment.
    // { step key (enum) : step name (string) } -- decided to use 2 parallel list for better indexing
    function rebuildMap() {
        let keys    = [] // parallel key list of step enum
        let values  = [] // parallel step name string list

        if ( ! vSettings.advancedMode ) {
            keys.push(PreTreatmentStack.Step.Concentrates)
            values.push(qsTr("Concentrates"))
        }

        keys.push(PreTreatmentStack.Step.Installation)
        values.push(qsTr("Installation"))

        keys.push(PreTreatmentStack.Step.SelfTests)
        values.push(qsTr("Self-Tests"))

        keys.push(PreTreatmentStack.Step.Saline)
        values.push(qsTr("Saline"))

        keys.push(PreTreatmentStack.Step.Prime)
        values.push(qsTr("Prime"))

        // TODO update to defeature later.. testing for science 🧪🔬
        if (_root.enableWaterSample) {
            keys.push(PreTreatmentStack.Step.WaterSample)
            values.push(qsTr("Water Sample"))
        }

        keys.push(PreTreatmentStack.Step.CreateRx)
        values.push(qsTr("Rx"))

        keys.push(PreTreatmentStack.Step.DialysateUF)
        values.push(qsTr("Dialysate/UF"))

        keys.push(PreTreatmentStack.Step.Connect)
        values.push(qsTr("Connect"))

        // 📋 reassign to notify bindings
        stepKeys = keys
        stepNames  = values
    }

    // clear create rx parameters
    function clear(vValue) { if ( ! vValue ) return;  _pretreatmentCreate.clear(vValue) }

    // handle ⏭️ confirm clicked on any pretreatment page
    function confirmClicked() {
        switch ( stepKeys[_root.stackStepIndex] ) {
        case PreTreatmentStack.Step.Concentrates:
            page ( _pretreatmentInstallation )
            break
        case PreTreatmentStack.Step.Installation:
            vPreTreatmentAdjustmentDisposablesConfirm.doConfirm()
            break
        case PreTreatmentStack.Step.SelfTests:
            page ( _pretreatmentSaline )
            break
        case PreTreatmentStack.Step.Saline:
            page ( _pretreatmentPrime )
            break
        case PreTreatmentStack.Step.Prime:
            if ( enableWaterSample )    { page ( _pretreatmentWaterSample ) }
            else                        { page ( _pretreatmentCreate )      }
            break
        case PreTreatmentStack.Step.WaterSample:
            page ( _pretreatmentCreate )
            break
        case PreTreatmentStack.Step.CreateRx:
            _pretreatmentCreate.confirmButtonClicked()
            if ( vTreatmentCreate.parametersValidated ) { page ( _pretreatmentDialysateUf ) }
            break
        case PreTreatmentStack.Step.DialysateUF:
            page ( _pretreatmentConnect )
            break
        case PreTreatmentStack.Step.Connect:
            // TODO Some FW request to enter Treatment mode
            break
        default:
            break
        }
    }

    // handle 🔙 back clicked on any pretreatment page
    function backClicked() {
        switch ( stepKeys[_root.stackStepIndex] ) {
        case PreTreatmentStack.Step.Concentrates:
            vPreTreatmentAdjustmentInitTreatment.doCancel() // request standby
            break
        case PreTreatmentStack.Step.Installation:
            if ( vSettings.advancedMode )   { vPreTreatmentAdjustmentInitTreatment.doCancel()   }
            else                            { page ( _pretreatmentConcentrates )                }
            break
        case PreTreatmentStack.Step.SelfTests:
            page ( _pretreatmentInstallation )
            break
        case PreTreatmentStack.Step.Saline:
            page ( _pretreatmentSelfTests )
            break
        case PreTreatmentStack.Step.Prime:
            page ( _pretreatmentSaline )
            break
        case PreTreatmentStack.Step.WaterSample:
            page ( _pretreatmentPrime )
            break
        case PreTreatmentStack.Step.CreateRx:
            if ( enableWaterSample )    { page ( _pretreatmentWaterSample ) }
            else                        { page ( _pretreatmentPrime )       }
            break
        case PreTreatmentStack.Step.DialysateUF:
            // 🙅‍♂️ No going back
            break
        case PreTreatmentStack.Step.Connect:
            page ( _pretreatmentDialysateUf )
            break
        default:
            break
        }
    }

    // handle text for the confirm button on any pretreatment page
    function confirmButtonText() {
        switch ( stepKeys[_root.stackStepIndex] ) {
        case PreTreatmentStack.Step.Concentrates:
            return qsTr("Next")
        case PreTreatmentStack.Step.Installation:
            return qsTr("Auto-Load")
        case PreTreatmentStack.Step.CreateRx:
            return vTreatmentCreate.parametersValidated
                   ? qsTr("CONFIRM")
                   : qsTr("VALIDATE")
        default:
            return qsTr("Next")
        }
    }

    // Header
    StepNavigationTitleBar { id: _titleBar
        stepIndex       : _root.stackStepIndex
        anchors {
            top         : _root.top
            left        : parent.left
            right       : parent.right
            leftMargin  : Variables.defaultMargin * 2
            rightMargin : anchors.leftMargin
        }
        confirmText.text: confirmButtonText()
        confirmVisible  : true
        confirmEnabled  : _root.isCreateRx ? _pretreatmentCreate.confirmReady()      : true
        backVisible     : _root.isCreateRx ? ! vTreatmentCreate.parametersValidated  : ! _root.isDialysteUf
        width           : _root.width
        stepNames       : _root.stepNames
        onBackClicked   : _root.backClicked()
        onConfirmClicked: _root.confirmClicked()
    }

    // Pages
    PreTreatmentBase    { id:   _pretreatmentConcentrates
        instructionBased    : true
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.Concentrates); updateModel()    }
    }

    PreTreatmentBase    { id:   _pretreatmentInstallation
        instructionBased    : true
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.Installation); updateModel()    }
    }

    PreTreatmentBase    { id:   _pretreatmentSelfTests
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.SelfTests);                     }
    }

    PreTreatmentBase    { id:   _pretreatmentSaline
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.Saline);                        }
    }

    PreTreatmentBase    { id:   _pretreatmentPrime
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.Prime);                         }
    }

    PreTreatmentBase    { id:   _pretreatmentWaterSample
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.WaterSample);                   }
    }

    PreTreatmentCreate  { id:   _pretreatmentCreate
        onVisibleChanged    : if (visible) {  _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.CreateRx)                      }
    }

    PreTreatmentBase    { id:   _pretreatmentDialysateUf
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.DialysateUF);                            }
    }

    PreTreatmentBase    { id:   _pretreatmentConnect
        onVisibleChanged    : if (visible) { _root.stackStepIndex = stepKeys.indexOf(PreTreatmentStack.Step.Connect);                       }
    }

    // Slots
    Connections { target: vPreTreatmentAdjustmentDisposablesConfirm
        function onAdjustmentTriggered              ( vValue ) {
            if ( vPreTreatmentAdjustmentDisposablesConfirm.adjustment_Accepted ) {
                _pretreatmentInstallation.informationText       = ""
                page ( _pretreatmentSelfTests )
            } else {
                 _pretreatmentInstallation.informationText    = vPreTreatmentAdjustmentDisposablesConfirm.text()
            }
        }
    }

    Connections { target: vTDOpMode
        function onPreTreatmentChanged( vValue ) {  if ( vSettings.advancedMode )   { page ( _pretreatmentInstallation      , vValue    )}
                                                    else                            { page ( _pretreatmentConcentrates      , vValue    )}
        }
    }

    // TODO in pre treatment story  --- Clean up in pre treatment story
//    PreTreatmentWaterSampleStack{ id: _preTreatmentWaterSampleStack     ;objectName: "_preTreatmentWaterSampleStack" }
//    PreTreatmentConsumablesStack{ id: _preTreatmentConsumablesStack     ;objectName: "_preTreatmentConsumablesStack" }
//    PreTreatmentPrimeStack      { id: _pretreatmentPrimeStack           ;objectName: "_pretreatmentPrimeStack"       }
//    PreTreatmentConnectionStack { id: _pretreatmentConnectionStack      ;objectName: "_pretreatmentConnectionStack " }

//    Connections { target: vPreTreatmentStates
//        function onWaterSampleChanged           ( vValue ) { page( _preTreatmentWaterSampleStack , vValue )}
//        function onSelfTestConsumablesChanged   ( vValue ) { page( _preTreatmentConsumablesStack , vValue )}
//        function onSelfTestNoCartridgeChanged   ( vValue ) { page( _preTreatmentDisposablesStack , vValue )}
//        function onInstallationChanged          ( vValue ) { page( _preTreatmentDisposablesStack , vValue )} // DEBUG: Experimental : console.debug("vinstallation       "
//        function onSelfTestDryChanged           ( vValue ) { page( _pretreatmentPrimeStack       , vValue )}
//        function onPrimeChanged                 ( vValue ) { page( _pretreatmentPrimeStack       , vValue )} // DEBUG: Experimental : console.debug("vprime              "
//        function onRecirculateChanged           ( vValue ) { page( _pretreatmentPrimeStack       , vValue )} // DEBUG: Experimental : console.debug("vrecirculate        "
//        function onPatientConnectionChanged     ( vValue ) { page( _pretreatmentConnectionStack  , vValue )}
//    }
}
