/*!
 *
 * 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 TreatmentCreate.qml
 * \author (last) Peter Lucia
 * \date (last) 06-Oct-2020
 * \author (original) Behrouz NematiPour
 * \date (original) 27-Jan-2020
 *
 */

// Qt
import QtQuick 2.12
import QtQuick.Controls 2.12

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

/*!
 * \brief   ManagerHome is the screen
 * which is the default screen in the "Manager" stack
 */
ScreenItem { id: _root
    objectName: "TreatmentCreate"; // SquishQt testability
    signal clickedBack()
    signal clickedContinue()
    backgroundRect.color: Colors.backgroundMainMenu

    TopMenuBarCreateTreatment { id: _topMenuBar
        anchors.top: parent.top
        anchors.left: parent.left
        width: parent.width
        onClickedBack: {
            _root.clickedBack();
        }
    }

    Flickable { id: _flickable
        objectName: "TreatmentCreateFlickable"
        anchors.top: _topMenuBar.bottom
        anchors.left: parent.left
        anchors.bottom: parent.bottom
        width: parent.width
        contentWidth: parent.width
        contentHeight: _column.implicitHeight
        clip: true
        flickDeceleration: Variables.createTreatmentFlickableDeceleration

        function setInteractive(isInteractive) {
            _flickable.interactive = isInteractive
        }

        ScrollBar.vertical: ScrollBar { id: _scrollBar
            anchors.right: _flickable.right
            anchors.rightMargin: 3
            contentItem: Rectangle {
                color: Colors.backgroundRangeRect
                implicitWidth: 6
                radius: width / 2
                width: 3
            }
        }

        Column { id: _column
            spacing: Variables.treatmentSpacing
            anchors.horizontalCenter: parent.horizontalCenter;
            anchors.fill: parent;

            Text { id: _titleText
                anchors.horizontalCenter: parent.horizontalCenter;
                text: qsTr("Create a Custom Treatment")
                color: Colors.textMain
                font.pixelSize: Fonts.fontPixelTitle
            }

            Text {
                anchors.horizontalCenter: parent.horizontalCenter;
                text: qsTr("PRESCRIPTION");
                color: Colors.textMain;
                font.pixelSize: Fonts.fontPixelButton
                font.bold: true

            }

            SliderCreateTreatment { id: _bloodFlowRate
                objectName: "_bloodFlowRate"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.bloodFlowRateMin
                max: vTreatmentCreate.bloodFlowRateMax
                step: vTreatmentCreate.bloodFlowRateRes
                text: qsTr("Blood Flow Rate")
                units: qsTr("mL/min")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.bloodFlowRate = value
                }
                onReleased: {
                    vTreatmentCreate.bloodFlowRate = value
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _dialysateFlowRate
                objectName: "_dialysateFlowRate"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.dialysateFlowRateMin
                max: vTreatmentCreate.dialysateFlowRateMax
                step: vTreatmentCreate.dialysateFlowRateRes
                text: qsTr("Dialysate Flow Rate")
                units: qsTr("mL/min")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.dialysateFlowRate = value;
                }
                onReleased: {
                    vTreatmentCreate.dialysateFlowRate = value;
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _duration
                objectName: "_duration"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.durationMin
                max: vTreatmentCreate.durationMax
                step: vTreatmentCreate.durationRes
                text: qsTr("Duration")
                units: qsTr("min")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.duration = value;
                }
                onReleased: {
                    vTreatmentCreate.duration = value;
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _heparinDispensingRate
                objectName: "_heparinDispensingRate"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.heparinDispensingRateMin
                max: vTreatmentCreate.heparinDispensingRateMax
                step: vTreatmentCreate.heparinDispensingRateRes
                text: qsTr("Heparin Dispensing Rate")
                units: qsTr("mL/hr")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.heparinDispensingRate = value
                }
                onReleased: {
                    vTreatmentCreate.heparinDispensingRate = value
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _heparinBolusVolume
                objectName: "_heparinBolusVolume"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.heparinBolusVolumeMin
                max: vTreatmentCreate.heparinBolusVolumeMax
                step: vTreatmentCreate.heparinBolusVolumeRes

                text: qsTr("Heparin Bolus Volume")
                units: qsTr("mL")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.heparinBolusVolume = value
                }
                onReleased: {
                    vTreatmentCreate.heparinBolusVolume = value
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _heparinStopTime
                objectName: "_heparinStopTime"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.heparinStopTimeMin
                max: vTreatmentCreate.heparinStopTimeMax
                step: vTreatmentCreate.heparinStopTimeRes
                text: qsTr("Heparin Stop Time")
                units: qsTr("min")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.heparinStopTime = value
                }
                onReleased: {
                    vTreatmentCreate.heparinStopTime = value
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment {
                id: _salineBolus
                objectName: "_salineBolus"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                text: "Saline Bolus"
                units: qsTr("mL")
                min: vTreatmentCreate.salineBolusVolumeMin
                max: vTreatmentCreate.salineBolusVolumeMax
                step: vTreatmentCreate.salineBolusVolumeRes
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.salineBolusVolume = value
                }
                onReleased: {
                    vTreatmentCreate.salineBolusVolume = value
                    _flickable.setInteractive(true)
                }
            }

            GridSelection {
                id: _acidConcentrate
                objectName: "_acidConcentrateRect"
                name: qsTr("Acid Concentrate")
                buttonNames: vTreatmentCreate.acidConcentrateOptions
                onButtonClicked: {
                    vTreatmentCreate.acidConcentrate = selectedIndex
                }
            }

            GridSelection { id: _bicarbonateConcentrate
                objectName: "_bicarbonateConcentrateRect"
                name: qsTr("Bicarbonate Concentrate")
                numRows: 1
                numCols: 2
                buttonNames: vTreatmentCreate.bicarbonateConcentrateOptions;
                onButtonClicked: {
                    vTreatmentCreate.bicarbonateConcentrate = selectedIndex;
                }
            }

            GridSelection { id: _dialyzerType
                objectName: "_dialyzerTypeRect"
                name: qsTr("Dialyzer Type")
                numRows: 3
                numCols: 2
                buttonNames: vTreatmentCreate.dialyzerTypeOptions;
                onButtonClicked: {
                    vTreatmentCreate.dialyzerType = selectedIndex;
                }
            }

            SliderCreateTreatment { id: _dialysateTemperature
                objectName: "_dialysateTemperature"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                min: vTreatmentCreate.dialysateTempMin
                max: vTreatmentCreate.dialysateTempMax
                step: vTreatmentCreate.dialysateTempRes
                text: qsTr("Dialysate Temperature")
                units: qsTr("C")
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.dialysateTemp = value
                }
                onReleased: {
                    vTreatmentCreate.dialysateTemp = value
                    _flickable.setInteractive(true)
                }
            }

            Text { id: _arterialPressureLimitsTitle
                text: qsTr("Arterial Pressure Limits")
                anchors.left: _arterialPressureLimits.left
                font.pixelSize: Fonts.fontPixelFluidText
                color: Colors.textMain;

            }

            SliderDoubleCreateTreatment { id: _arterialPressureLimits
                objectName: "_arterialPressureLimits"
                lowSliderObjectName: objectName + "LowSlider"
                lowSelectedValueObjectName: objectName + "LowValue"
                highSliderObjectName: objectName + "HighSlider"
                highSelectedValueObjectName: objectName + "HighValue"
                lowTitle: qsTr("Low")
                lowUnits: qsTr("mmHg")
                highTitle: qsTr("High")
                highUnits: qsTr("mmHg")
                lowMin: vTreatmentCreate.arterialPressureLimitLowMin
                lowMax: vTreatmentCreate.arterialPressureLimitLowMax
                highMin: vTreatmentCreate.arterialPressureLimitHighMin
                highMax: vTreatmentCreate.arterialPressureLimitHighMax
                lowValue: vTreatmentCreate.arterialPressureLimitLowMin
                highValue: vTreatmentCreate.arterialPressureLimitHighMin
                lowStep: vTreatmentCreate.arterialPressureLimitLowRes
                highStep: vTreatmentCreate.arterialPressureLimitHighRes
                onLowSliderPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.arterialPressureLimitLow = lowValue
                }
                onLowSliderReleased: {
                    vTreatmentCreate.arterialPressureLimitLow = lowValue
                    _flickable.setInteractive(true)
                }
                onHighSliderPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.arterialPressureLimitHigh = highValue
                }
                onHighSliderReleased: {
                    vTreatmentCreate.arterialPressureLimitHigh = highValue
                    _flickable.setInteractive(true)
                }
            }

            Text { id: _venousPressureLimitsTitle
                text: qsTr("Venous Pressure Limits")
                anchors.left: _venousPressureLimits.left
                font.pixelSize: Fonts.fontPixelFluidText
                color: Colors.textMain;

            }

            SliderDoubleCreateTreatment { id: _venousPressureLimits
                objectName: "_venousPressureLimits"
                lowSliderObjectName: objectName + "LowSlider"
                lowSelectedValueObjectName: objectName + "LowValue"
                highSliderObjectName: objectName + "HighSlider"
                highSelectedValueObjectName: objectName + "HighValue"
                lowTitle: qsTr("Low")
                lowUnits: Variables.unitTextBloodPressure
                highTitle: qsTr("High")
                highUnits: Variables.unitTextBloodPressure
                lowMin: vTreatmentCreate.venousPressureLimitLowMin
                lowMax: vTreatmentCreate.venousPressureLimitLowMax
                highMin: vTreatmentCreate.venousPressureLimitHighMin
                highMax: vTreatmentCreate.venousPressureLimitHighMax
                lowValue: vTreatmentCreate.venousPressureLimitLowMin
                highValue: vTreatmentCreate.venousPressureLimitHighMin
                lowStep: vTreatmentCreate.venousPressureLimitLowRes
                highStep: vTreatmentCreate.venousPressureLimitHighRes
                onLowSliderPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.venousPressureLimitLow = lowValue
                }
                onLowSliderReleased: {
                    vTreatmentCreate.venousPressureLimitLow = lowValue
                    _flickable.setInteractive(true)
                }
                onHighSliderPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.venousPressureLimitHigh = highValue
                }
                onHighSliderReleased: {
                    vTreatmentCreate.venousPressureLimitHigh = highValue
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _bloodPressureMeasurementInterval
                objectName: "_bloodPressureMeasurementInterval"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                text: qsTr("Blood Pressure Measurement Interval")
                units: Variables.unitTextBPMeasurementInterval
                min: vTreatmentCreate.bloodPressureMeasureIntervalMin
                max: vTreatmentCreate.bloodPressureMeasureIntervalMax
                step: vTreatmentCreate.bloodPressureMeasureIntervalRes
                stepSnap: true
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.bloodPressureMeasureInterval = value
                }
                onReleased: {
                    vTreatmentCreate.bloodPressureMeasureInterval = value
                    _flickable.setInteractive(true)
                }
            }

            SliderCreateTreatment { id: _rinsebackFlowRate
                objectName: "_rinsebackFlowRate"
                sliderObjectName: objectName + "Slider"
                selectedValueObjectName: objectName + "Value"
                text: qsTr("Rinseback Flow Rate")
                units: Variables.unitTextFlowRate
                min: vTreatmentCreate.rinsebackFlowRateMin
                max: vTreatmentCreate.rinsebackFlowRateMax
                step: vTreatmentCreate.rinsebackFlowRateRes
                stepSnap: true
                onPressed: {
                    _flickable.setInteractive(false)
                    vTreatmentCreate.rinsebackFlowRate = value
                }
                onReleased: {
                    vTreatmentCreate.rinsebackFlowRate = value
                    _flickable.setInteractive(true)
                }
            }

            TouchRect { id : _continueRect
                objectName: "_continueButton"
                anchors.horizontalCenter: parent.horizontalCenter
                text.text: qsTr("CONTINUE")
                backgroundColor: Colors.createTreatmentNotReady
                borderColor: Colors.createTreatmentNotReady
                textColor: Colors.createTreatmentTextNotReady
                button.onClicked: {
                    vTreatmentCreate.saveTreatmentProfile = false;
                    if (vTreatmentCreate.continueEnabled) {
                        _root.clickedContinue()
                    }
                }

                function toggleEnabled(enabled) {
                    if (enabled) {
                        backgroundColor = Colors.createTreatmentActive
                        borderColor = Colors.createTreatmentActive
                        textColor = Colors.createTreatmentTextReady
                    } else {
                        backgroundColor = Colors.createTreatmentNotReady
                        borderColor = Colors.createTreatmentNotReady
                        textColor = Colors.createTreatmentTextNotReady
                    }
                }
            }

            Rectangle {
                id: _spacer
                height: 75
                width: parent.width
                color: "transparent"
            }
        }
    }

    onVisibleChanged: {
        if (visible) {
            _mainMenu.hidden = true
        }
    }

    Connections { target: vTreatmentCreate
        onContinueEnabledChanged: {
            if (vTreatmentCreate.continueEnabled) {
                _continueRect.toggleEnabled(true)
            } else {
                _continueRect.toggleEnabled(false)

            }
        }

        onResetCreateTreatment: {
            _bloodFlowRate.isActive = false;
            _dialysateFlowRate.isActive = false;
            _duration.isActive = false;
            _heparinDispensingRate.isActive = false;

            _heparinBolusVolume.isActive = false;
            _heparinStopTime.isActive = false;

            _salineBolus.isActive = false;
            _acidConcentrate.setActive(false);
            _bicarbonateConcentrate.setActive(false);
            _dialyzerType.setActive(false);

            _dialysateTemperature.isActive = false;
            _arterialPressureLimits.isLowActive = false;
            _arterialPressureLimits.isHighActive = false;
            _venousPressureLimits.isLowActive = false;
            _venousPressureLimits.isHighActive = false;
            _bloodPressureMeasurementInterval.isActive = false;
            _rinsebackFlowRate.isActive = false;

        }

        onFwValidationSuccess: {
            _bloodFlowRate                     .setValid    (true)
            _dialysateFlowRate                 .setValid    (true)
            _duration                          .setValid    (true)
            _heparinDispensingRate             .setValid    (true)

            _heparinBolusVolume                .setValid    (true)
            _heparinStopTime                   .setValid    (true)

            _salineBolus                       .setValid    (true)
            _acidConcentrate                   .setValid    (true)
            _bicarbonateConcentrate            .setValid    (true)
            _dialyzerType                      .setValid    (true)

            _dialysateTemperature              .setValid    (true)
            _arterialPressureLimits            .setLowValid (true)
            _arterialPressureLimits            .setHighValid(true)
            _venousPressureLimits              .setLowValid (true)
            _venousPressureLimits              .setHighValid(true)
            _bloodPressureMeasurementInterval  .setValid    (true)
            _rinsebackFlowRate                 .setValid    (true)
        }

        onFwValidationFailed: {
        }

        onBloodFlowRate_ValidationFailed: {
            _bloodFlowRate.setValid(false)
        }

        onDialysateFlowRate_ValidationFailed: {
            _dialysateFlowRate.setValid(false)
        }

        onDuration_ValidationFailed: {
            _duration.setValid(false)
        }

        onHeparinDispensingRate_ValidationFailed: {
            _heparinDispensingRate.setValid(false)
        }

        onHeparinBolusVolume_ValidationFailed: {
            _heparinBolusVolume.setValid(false)
        }

        onHeparinStopTime_ValidationFailed: {
            _heparinStopTime.setValid(false)
        }

        onSalineBolusVolume_ValidationFailed: {
            _salineBolus.setValid(false)
        }

        onAcidConcentrate_ValidationFailed: {
            _acidConcentrate.setValid(false)
        }

        onBicarbonateConcentrate_ValidationFailed: {
            _bicarbonateConcentrate.setValid(false)
        }

        onDialyzerType_ValidationFailed: {
            _dialyzerType.setValid(false)
        }

        onDialysateTemp_ValidationFailed: {
            _dialysateTemperature.setValid(false)
        }

        onArterialPressureLimitLow_ValidationFailed: {
            _arterialPressureLimits.setLowValid(false)
        }

        onArterialPressureLimitHigh_ValidationFailed: {
            _arterialPressureLimits.setHighValid(false)
        }

        onVenousPressureLimitLow_ValidationFailed: {
            _venousPressureLimits.setLowValid(false)
        }

        onVenousPressureLimitHigh_ValidationFailed: {
            _venousPressureLimits.setHighValid(false)
        }

        onBloodPressureMeasureInterval_ValidationFailed: {
            _bloodPressureMeasurementInterval.setValid(false)
        }

        onRinsebackFlowRate_ValidationFailed: {
            _rinsebackFlowRate.setValid(false)
        }

        onScrollToParameter: {
            let prefix = "data.";
            let contentYMargin = 80;
            let newContentY = 0;

            if (parameter === prefix+"bloodFlowRate") {
               newContentY = _bloodFlowRate.mapToItem(_bloodFlowRate.parent, 0, 0).y;
            }
            else if (parameter === prefix+"dialysateFlowRate") {
               newContentY = _dialysateFlowRate.mapToItem(_dialysateFlowRate.parent, 0, 0).y;
            }
            else if (parameter === prefix+"duration") {
               newContentY = _duration.mapToItem(_duration.parent, 0, 0).y;
            }
            else if (parameter === prefix+"heparinDispensingRate") {
               newContentY = _heparinDispensingRate.mapToItem(_heparinDispensingRate.parent, 0, 0).y;
            }
            else if (parameter === prefix+"heparinBolusVolume") {
               newContentY = _heparinBolusVolume.mapToItem(_heparinBolusVolume.parent, 0, 0).y;
            }
            else if (parameter === prefix+"heparinStopTime") {
               newContentY = _heparinStopTime.mapToItem(_heparinStopTime.parent, 0, 0).y;
            }
            else if (parameter === prefix+"salineBolus") {
               newContentY = _salineBolus.mapToItem(_salineBolus.parent, 0, 0).y;
            }
            else if (parameter === prefix+"acidConcentrate") {
               newContentY = _acidConcentrate.mapToItem(_acidConcentrate.parent, 0, 0).y;
            }
            else if (parameter === prefix+"bicarbonateConcentrate") {
               newContentY = _bicarbonateConcentrate.mapToItem(_bicarbonateConcentrate.parent, 0, 0).y;
            }
            else if (parameter === prefix+"dialyzerType") {
               newContentY = _dialyzerType.mapToItem(_dialyzerType.parent, 0, 0).y;
            }
            else if (parameter === prefix+"dialysateTemp") {
               newContentY = _dialysateTemperature.mapToItem(_dialysateTemperature.parent, 0, 0).y;
            }
            else if (parameter === prefix+"arterialPressureLimitLow" ||
                     parameter === prefix+"arterialPressureLimitHigh") {
               newContentY = _arterialPressureLimits.mapToItem(_arterialPressureLimits.parent, 0, 0).y;
            }
            else if (parameter === prefix+"venousPressureLimitLow" ||
                     parameter === prefix+"venousPressureLimitHigh") {
               newContentY = _venousPressureLimits.mapToItem(_venousPressureLimits.parent, 0, 0).y;
            }
            else if (parameter === prefix+"bloodPressureMeasureInterval") {
               newContentY = _bloodPressureMeasurementInterval.mapToItem(_bloodPressureMeasurementInterval.parent, 0, 0).y;
            }
            else if (parameter === prefix+"rinsebackFlowRate") {
               newContentY = _rinsebackFlowRate.mapToItem(_rinsebackFlowRate.parent, 0, 0).y;
            }
            else {
                return;
            }
            _flickable.contentY = newContentY - contentYMargin;
        }
    }
}
