/*!
 *
 * 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 TreatmentStack.qml
 * \author (last) Behrouz NematiPour
 * \date (last) 18-Aug-2020
 * \author (original) Behrouz NematiPour
 * \date (original) 27-Jan-2020
 *
 */

// Qt
import QtQuick 2.12

// Project
import Gui.Actions                  0.1
import VTreatmentRanges             0.1
import VTreatmentAdjustmentSaline   0.1
import VHDTreatmentStates           0.1

//  Qml imports
import "qrc:/globals"
import "qrc:/components"
import "qrc:/pages/treatment/adjustments"
/*!
 * \brief   TreatmentStack is the screen
 * which contains the main stack for all the Trearment screens
 * This is the screen which will be show up when "Treatment" option
 * is selected from the main menu.
 */
StackItem { id : _root
    objectName: "TreatmentStack"

    stackView.initialItem   : _treatmentHome

    // Views
    VTreatmentRanges            { id: vTreatmentRanges           }
    VTreatmentAdjustmentSaline  { id: vTreatmentAdjustmentSaline }
    VHDTreatmentStates          { id: vHDTreatmentStates
        property bool ufPaused  : ufState ===   GuiActions.UF_PAUSED_STATE
        property bool txPaused  : subMode === ! GuiActions.TREATMENT_DIALYSIS_STATE
    }

    // Components
    MainMenu                { id: _treatmentMenu
        y               : -Variables.mainMenuHeight
        position        : MainMenu.Position.Top
        hidden          : true
        titles          : [ qsTr("Back") , qsTr("Treatment") , qsTr("Trending") , qsTr("Settings") ]
        spacing         :  20
        leftPdding      :  20
        partitionWidth  : 100 // Todo Important : max width should be the width for all
        hasRightText    : true
        hasLogo         : true
    }

    TreatmentHome               { id:       _treatmentHome
        onTreatmentStarted      : push( _treatmentStart )
        onTreatmentCreated      : push( _treatmentCreate)
    }

    TreatmentStart              { id:       _treatmentStart
        onBackClicked           : pop ()
        onSectionFlowClicked    : {
            _treatmentAdjustmentFlow.open()
        }
        onSectionTimeClicked    : {
            _treatmentAdjustmentDuration.durationValue = vTreatmentTime.time_Total / 60 // minutes => hours
            _treatmentAdjustmentDuration.open()
        }
        onSectionUltrafiltrationClicked: {
            if (
                    vTreatmentAdjustmentUltrafiltrationState.isPaused || // comes from the treatment adjustment
                    vHDTreatmentStates.ufPaused                          // comes from the broadcast Treatment States salineState field
            ) {
                _treatmentAdjustmentUltrafiltrationPaused.open()
            } else {
                _treatmentAdjustmentUltrafiltrationStart .open()
            }
        }
    }

    TreatmentCreate             { id:       _treatmentCreate
        onBackClicked           : pop()
    }

    //// Treatment Adjustment Dialogs
    TreatmentAdjustmentFlow     { id:       _treatmentAdjustmentFlow
        onCloseClicked          : close()
        onConfirmClicked        : vTreatmentAdjustmentFlows.doAdjustment(bloodFlowRateValue, dialysateFlowRateValue)
    }
    TreatmentAdjustmentDuration { id:       _treatmentAdjustmentDuration
        onCloseClicked          : close()
        onConfirmClicked        : vTreatmentAdjustmentDuration.doAdjustment(durationValue)
    }

    TreatmentAdjustmentUltrafiltrationStart { id: _treatmentAdjustmentUltrafiltrationStart
        onCloseClicked          : close()
        onPauseClicked          : {
            // send pause to HD and wait.
            // if accepted close()
            // not accepted show error in notification
            vTreatmentAdjustmentUltrafiltrationState.doPause()
        }
    }

    TreatmentAdjustmentUltrafiltrationPaused { id: _treatmentAdjustmentUltrafiltrationPaused
        onCloseClicked          : close()
        onEditClicked           : {
            close()
            _treatmentAdjustmentUltrafiltrationEdit.reset() // reset the slider to minimum value position
            _treatmentAdjustmentUltrafiltrationEdit.open()
        }
        onResumeClicked         : {
            // send resume to HD and wait.
            // if accepted close()
            // not accepted show error in notification
            vTreatmentAdjustmentUltrafiltrationState.doResume()
        }
    }

    TreatmentAdjustmentUltrafiltrationEdit { id: _treatmentAdjustmentUltrafiltrationEdit
        onBackClicked           : {
            close()
            _treatmentAdjustmentUltrafiltrationPaused.open()
        }
        onNextClicked           : {
            // send Volume to HD and wait.
            // if accepted close()
            // not accepted show error in notification
            vTreatmentAdjustmentUltrafiltrationEdit.doAdjustment(vVolume)
        }
    }

    TreatmentAdjustmentUltrafiltrationConfirm { id: _treatmentAdjustmentUltrafiltrationConfirm
        onBackClicked           : {
            close()
            _treatmentAdjustmentUltrafiltrationEdit.open ()
        }
        onConfirmRateClicked    : {
            vTreatmentAdjustmentUltrafiltrationConfirm.doOptionRate(vVolume)
        }
        onConfirmDurationClicked: {
            vTreatmentAdjustmentUltrafiltrationConfirm.doOptionDuration(vVolume)
        }
    }

    // ---------- Manages Responses ----------
    Connections { target: vTreatmentAdjustmentDuration
        onAdjustmentTriggered   : {
            if ( vTreatmentAdjustmentDuration.adjustment_Accepted ) {
                vTreatmentUltrafiltration.maximum               = vTreatmentAdjustmentDuration.ultrafiltration
                _treatmentAdjustmentDuration.accept()
            } else {
                _treatmentAdjustmentDuration.durationValue      = vTreatmentAdjustmentDuration.duration;
                _treatmentAdjustmentDuration.notification.text  = vTreatmentAdjustmentDuration.text();
            }
        }
    }

    Connections { target: vTreatmentAdjustmentUltrafiltrationState
        onAdjustmentTriggered   : {
            if ( vTreatmentAdjustmentUltrafiltrationState.adjustment_Accepted ) {
                if ( vTreatmentAdjustmentUltrafiltrationState.isPaused ) {
                    _treatmentAdjustmentUltrafiltrationStart .close()
                    _treatmentAdjustmentUltrafiltrationPaused.open ()
                } else {
                    _treatmentAdjustmentUltrafiltrationPaused.close()
                }
            } else {
                if ( vTreatmentAdjustmentUltrafiltrationState.isPaused ) {
                    _treatmentAdjustmentUltrafiltrationPaused.notification.text = vTreatmentAdjustmentUltrafiltrationState.text()
                } else {
                    _treatmentAdjustmentUltrafiltrationStart .notification.text = vTreatmentAdjustmentUltrafiltrationState.text()
                }
            }
        }
    }

    Connections { target: vTreatmentAdjustmentUltrafiltrationEdit
        onAdjustmentTriggered   : {
            if (vTreatmentAdjustmentUltrafiltrationEdit.adjustment_Accepted) {
                _treatmentAdjustmentUltrafiltrationConfirm.ultrafiltrationVolume    = vTreatmentAdjustmentUltrafiltrationEdit.volume
                _treatmentAdjustmentUltrafiltrationConfirm.treatmentDuration        = vTreatmentAdjustmentUltrafiltrationEdit.duration
                _treatmentAdjustmentUltrafiltrationConfirm.treatmentDurationDiff    = vTreatmentAdjustmentUltrafiltrationEdit.durationDiff
                _treatmentAdjustmentUltrafiltrationConfirm.ultrafiltrationRate      = vTreatmentAdjustmentUltrafiltrationEdit.rate
                _treatmentAdjustmentUltrafiltrationConfirm.ultrafiltrationRateDiff  = vTreatmentAdjustmentUltrafiltrationEdit.rateDiff
                _treatmentAdjustmentUltrafiltrationConfirm.ultrafiltrationRateOld   = vTreatmentAdjustmentUltrafiltrationEdit.rateOld

                _treatmentAdjustmentUltrafiltrationEdit   .close()
                _treatmentAdjustmentUltrafiltrationConfirm.reset()
                _treatmentAdjustmentUltrafiltrationConfirm.open ()
            } else {
                _treatmentAdjustmentUltrafiltrationEdit.notification.text = vTreatmentAdjustmentUltrafiltrationEdit.text()
            }
        }
    }

    Connections { target: vTreatmentAdjustmentUltrafiltrationConfirm
        onAdjustmentTriggered   : {
            if (vTreatmentAdjustmentUltrafiltrationConfirm.adjustment_Accepted) {
                // HD resumes the ultrafiltration and no need to recall the doPause just update the state
                vTreatmentAdjustmentUltrafiltrationState.isPaused           = false
                vTreatmentUltrafiltration.maximum                           = vTreatmentAdjustmentUltrafiltrationConfirm.volume
                _treatmentAdjustmentUltrafiltrationConfirm.close()
            } else {
                _treatmentAdjustmentUltrafiltrationConfirm.notification.text = vTreatmentAdjustmentUltrafiltrationConfirm.text()
            }
        }
    }
}
