/*!
 *
 * Copyright (c) 2025-2025 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    SettingsInstitutionalRecord.qml
 * \author  (last)      Nico Ramirez
 * \date    (last)      10-Nov-2025
 * \author  (original)  Nico Ramirez
 * \date    (original)  10-Nov-2025
 *
 */

// Qt
import QtQuick 2.12
import QtQuick.Controls 2.12
import QtGraphicalEffects 1.12

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

/*!
 * \brief   SettingsInstitutionalRecord is the screen
 *          which queries the system for the versions and serial numbers and service records
 *          and display them
 */
SettingsBase    { id: _root
    itemIndex                       : SettingsStack.InstitutionalRecord
    contentArea.anchors.rightMargin : 0
    confirmVisible                  : serviceMode

    property bool canEdit           : serviceMode
    property var title              : vInstitutionalRecord.parametersTitle
    property var unit               : vInstitutionalRecord.parametersUnit

    readonly property int min       : 0
    readonly property int max       : 1
    readonly property int def       : 2
    readonly property int defCustom : 3

    readonly property int none      : -1

    enum Records {
        BloodFlowRate                   ,
        DialysateFlowRate               ,
        TreatmentDuration               ,
        HeparinBolusVolume              ,
        HeparinDispenseRate             ,
        HeparinStopTime                 ,
        DialysateTemperature            ,
        AcidCompositionPotassium        ,
        AcidCompositionCalcium          ,
        BicarbFinalDialysateComposition ,
        SodiumFinalDialysateComposition ,
        FluidBolusVolume                ,
        ArterialPressureLimit           ,
        VenousPressureLimit             ,
        VenousAsymPressureLimit         ,
        TMPWindowLimit                  ,
        UFVolume                        ,
        VitalsInterval                  ,
        RinsebackVolume                 ,
        RinsebackFlowRate               ,
        SubstitutionVolume
    }

    onConfirmClicked: {
        vAdjustmentInstitutionalRecord.bloodFlowRateMin                     =   getValue(SettingsInstitutionalRecord.BloodFlowRate)[min]
        vAdjustmentInstitutionalRecord.bloodFlowRateMax                     =   getValue(SettingsInstitutionalRecord.BloodFlowRate)[max]
        vAdjustmentInstitutionalRecord.bloodFlowRateDef                     =   getValue(SettingsInstitutionalRecord.BloodFlowRate)[def]
        vAdjustmentInstitutionalRecord.dialysateFlowRateMin                 =   getValue(SettingsInstitutionalRecord.DialysateFlowRate)[min]
        vAdjustmentInstitutionalRecord.dialysateFlowRateMax                 =   getValue(SettingsInstitutionalRecord.DialysateFlowRate)[max]
        vAdjustmentInstitutionalRecord.dialysateFlowRateDef                 =   getValue(SettingsInstitutionalRecord.DialysateFlowRate)[def]
        vAdjustmentInstitutionalRecord.treatmentDurationMin                 =   getValue(SettingsInstitutionalRecord.TreatmentDuration)[min]
        vAdjustmentInstitutionalRecord.treatmentDurationMax                 =   getValue(SettingsInstitutionalRecord.TreatmentDuration)[max]
        vAdjustmentInstitutionalRecord.treatmentDurationDef                 =   getValue(SettingsInstitutionalRecord.TreatmentDuration)[def]
        vAdjustmentInstitutionalRecord.heparinBolusVolumeMin                =   getValue(SettingsInstitutionalRecord.HeparinBolusVolume)[min]
        vAdjustmentInstitutionalRecord.heparinBolusVolumeMax                =   getValue(SettingsInstitutionalRecord.HeparinBolusVolume)[max]
        vAdjustmentInstitutionalRecord.heparinBolusVolumeDef                =   getValue(SettingsInstitutionalRecord.HeparinBolusVolume)[def]
        vAdjustmentInstitutionalRecord.heparinDispensingRateMin             =   getValue(SettingsInstitutionalRecord.HeparinDispenseRate)[min]
        vAdjustmentInstitutionalRecord.heparinDispensingRateMax             =   getValue(SettingsInstitutionalRecord.HeparinDispenseRate)[max]
        vAdjustmentInstitutionalRecord.heparinDispensingRateDef             =   getValue(SettingsInstitutionalRecord.HeparinDispenseRate)[def]
        vAdjustmentInstitutionalRecord.heparinStopTimeMin                   =   getValue(SettingsInstitutionalRecord.HeparinStopTime)[min]
        vAdjustmentInstitutionalRecord.heparinStopTimeMax                   =   getValue(SettingsInstitutionalRecord.HeparinStopTime)[max]
        vAdjustmentInstitutionalRecord.dialysateTempMin                     =   getValue(SettingsInstitutionalRecord.DialysateTemperature)[min]
        vAdjustmentInstitutionalRecord.dialysateTempMax                     =   getValue(SettingsInstitutionalRecord.DialysateTemperature)[max]
        vAdjustmentInstitutionalRecord.dialysateTempDef                     =   getValue(SettingsInstitutionalRecord.DialysateTemperature)[def]
        vAdjustmentInstitutionalRecord.acidConcentratePotassiumMin          =   getValue(SettingsInstitutionalRecord.AcidCompositionPotassium)[min]
        vAdjustmentInstitutionalRecord.acidConcentratePotassiumMax          =   getValue(SettingsInstitutionalRecord.AcidCompositionPotassium)[max]
        vAdjustmentInstitutionalRecord.acidConcentrateCalciumMin            =   getValue(SettingsInstitutionalRecord.AcidCompositionCalcium)[min]
        vAdjustmentInstitutionalRecord.acidConcentrateCalciumMax            =   getValue(SettingsInstitutionalRecord.AcidCompositionCalcium)[max]
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMin   =   getValue(SettingsInstitutionalRecord.BicarbFinalDialysateComposition)[min]
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMax   =   getValue(SettingsInstitutionalRecord.BicarbFinalDialysateComposition)[max]
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionDef   =   getValue(SettingsInstitutionalRecord.BicarbFinalDialysateComposition)[def]
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMin   =   getValue(SettingsInstitutionalRecord.SodiumFinalDialysateComposition)[min]
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMax   =   getValue(SettingsInstitutionalRecord.SodiumFinalDialysateComposition)[max]
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionDef   =   getValue(SettingsInstitutionalRecord.SodiumFinalDialysateComposition)[def]
        vAdjustmentInstitutionalRecord.fluidBolusVolumeMin                  =   getValue(SettingsInstitutionalRecord.FluidBolusVolume)[min]
        vAdjustmentInstitutionalRecord.fluidBolusVolumeMax                  =   getValue(SettingsInstitutionalRecord.FluidBolusVolume)[max]
        vAdjustmentInstitutionalRecord.fluidBolusVolumeDef                  =   getValue(SettingsInstitutionalRecord.FluidBolusVolume)[def]
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMin       =   getValue(SettingsInstitutionalRecord.ArterialPressureLimit)[min]
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMax       =   getValue(SettingsInstitutionalRecord.ArterialPressureLimit)[max]
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowDef       =   getValue(SettingsInstitutionalRecord.ArterialPressureLimit)[def]
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowMin         =   getValue(SettingsInstitutionalRecord.VenousPressureLimit)[min]
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowMax         =   getValue(SettingsInstitutionalRecord.VenousPressureLimit)[max]
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowDef         =   getValue(SettingsInstitutionalRecord.VenousPressureLimit)[def]
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMin        =   getValue(SettingsInstitutionalRecord.VenousAsymPressureLimit)[min]
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMax        =   getValue(SettingsInstitutionalRecord.VenousAsymPressureLimit)[max]
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcDef        =   getValue(SettingsInstitutionalRecord.VenousAsymPressureLimit)[def]
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMin    =   getValue(SettingsInstitutionalRecord.TMPWindowLimit)[min]
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMax    =   getValue(SettingsInstitutionalRecord.TMPWindowLimit)[max]
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowDef    =   getValue(SettingsInstitutionalRecord.TMPWindowLimit)[def]
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMin             =   getValue(SettingsInstitutionalRecord.UFVolume)[min]
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMax             =   getValue(SettingsInstitutionalRecord.UFVolume)[max]
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeDef             =   getValue(SettingsInstitutionalRecord.UFVolume)[def]
        vAdjustmentInstitutionalRecord.vitalsIntervalDef                    =   getValue(SettingsInstitutionalRecord.VitalsInterval)[defCustom]
        vAdjustmentInstitutionalRecord.rinsebackVolumeMin                   =   getValue(SettingsInstitutionalRecord.RinsebackVolume)[min]
        vAdjustmentInstitutionalRecord.rinsebackVolumeMax                   =   getValue(SettingsInstitutionalRecord.RinsebackVolume)[max]
        vAdjustmentInstitutionalRecord.rinsebackVolumeDef                   =   getValue(SettingsInstitutionalRecord.RinsebackVolume)[def]
        vAdjustmentInstitutionalRecord.rinsebackFlowRateMin                 =   getValue(SettingsInstitutionalRecord.RinsebackFlowRate)[min]
        vAdjustmentInstitutionalRecord.rinsebackFlowRateMax                 =   getValue(SettingsInstitutionalRecord.RinsebackFlowRate)[max]
        vAdjustmentInstitutionalRecord.rinsebackFlowRateDef                 =   getValue(SettingsInstitutionalRecord.RinsebackFlowRate)[def]
        vAdjustmentInstitutionalRecord.substitutionVolumeMin                =   getValue(SettingsInstitutionalRecord.SubstitutionVolume)[min]
        vAdjustmentInstitutionalRecord.substitutionVolumeMax                =   getValue(SettingsInstitutionalRecord.SubstitutionVolume)[max]
        vAdjustmentInstitutionalRecord.substitutionVolumeDef                =   getValue(SettingsInstitutionalRecord.SubstitutionVolume)[def]

        vAdjustmentInstitutionalRecord.doConfirm()
    }

    function getValue(vRecord) {
        let delegateItem = _listView.itemAtIndex(vRecord)
        if (delegateItem) {
            return [ delegateItem.minValue, delegateItem.maxValue, delegateItem.defValue, delegateItem.defCustomValue ]
        }
        else {
            return [ 0, 0, 0, 0 ]
        }
    }

    function clearErrors() {
        vAdjustmentInstitutionalRecord.bloodFlowRateMinRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.bloodFlowRateMaxRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.bloodFlowRateDefRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateFlowRateMinRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateFlowRateMaxRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateFlowRateDefRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.treatmentDurationMinRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.treatmentDurationMaxRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.treatmentDurationDefRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinBolusVolumeMinRejectionReason                 =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinBolusVolumeMaxRejectionReason                 =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinBolusVolumeDefRejectionReason                 =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinDispensingRateMinRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinDispensingRateMaxRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinDispensingRateDefRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinStopTimeMinRejectionReason                    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.heparinStopTimeMaxRejectionReason                    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateTempMinRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateTempMaxRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.dialysateTempDefRejectionReason                      =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.acidConcentratePotassiumMinRejectionReason           =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.acidConcentratePotassiumMaxRejectionReason           =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.acidConcentrateCalciumMinRejectionReason             =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.acidConcentrateCalciumMaxRejectionReason             =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMinRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMaxRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionDefRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMinRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMaxRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionDefRejectionReason    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.fluidBolusVolumeMinRejectionReason                   =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.fluidBolusVolumeMaxRejectionReason                   =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.fluidBolusVolumeDefRejectionReason                   =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMinRejectionReason        =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMaxRejectionReason        =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.arterialPressureLimitWindowDefRejectionReason        =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowMinRejectionReason          =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowMaxRejectionReason          =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitWindowDefRejectionReason          =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMinRejectionReason         =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMaxRejectionReason         =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcDefRejectionReason         =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMinRejectionReason     =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMaxRejectionReason     =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowDefRejectionReason     =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMinRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMaxRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.ultrafiltrationVolumeDefRejectionReason              =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.vitalsIntervalDefRejectionReason                     =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackVolumeMinRejectionReason                    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackVolumeMaxRejectionReason                    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackVolumeDefRejectionReason                    =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackFlowRateMinRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackFlowRateMaxRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.rinsebackFlowRateDefRejectionReason                  =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.substitutionVolumeMinRejectionReason                 =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.substitutionVolumeMaxRejectionReason                 =   Variables.noRejectReason
        vAdjustmentInstitutionalRecord.substitutionVolumeDefRejectionReason                 =   Variables.noRejectReason
    }

    Connections { target: vInstitutionalRecord
        function onAdjustmentTriggered          ( vValue ) {
            if ( vInstitutionalRecord.adjustment_Accepted ) {
                _root.notificationText = ""
                initModel()
            }
            else {
                _root.notificationText = vInstitutionalRecord.adjustment_ReasonText
            }
        }
    }

    Connections { target: vAdjustmentInstitutionalRecord
        function onAdjustmentTriggered              ( vValue ) {
            if ( vAdjustmentInstitutionalRecord.adjustment_Accepted ) {
                _root.notificationText = qsTr("Institutional records and preferences updated")
                clearErrors()
            }
            else {
                _root.notificationText = qsTr("Error Adjusting Institutional Records")
            }
        }
    }

    // To populate model with parameter ranges and initial/ set value of each institutional setting
    // min      -   minimum range from param ranges         (DataList.conf)
    // max      -   maximum range from param ranges         (DataList.conf)
    // step     -   step or resolution from param ranges    (DataList.conf)
    // minVal   -   minimum value from institutional settings in FW
    // maxVin   -   maximum value from institutional settings in FW
    // defVal   -   default value from institutional settings in FW
    // decimal  -    preceision of value
    // rejection-   rejection re3ason from adjust record
    function initModel() {
        institutionalModel.clear()
        // Order matters
        // BloodFlowRate
        institutionalModel.append({ "min"   : vTreatmentRanges.bloodFlowRateMin,                "max"         : vTreatmentRanges.bloodFlowRateMax,
                                    "step"  : vTreatmentRanges.bloodFlowRateRes,                "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.bloodFlowRateMin,            "rejectionMax": vAdjustmentInstitutionalRecord.bloodFlowRateMaxRejectionReason,
                                    "maxVal": vInstitutionalRecord.bloodFlowRateMax,            "rejectionMin": vAdjustmentInstitutionalRecord.bloodFlowRateMinRejectionReason,
                                    "defVal": vInstitutionalRecord.bloodFlowRateDef,            "rejectionDef": vAdjustmentInstitutionalRecord.bloodFlowRateDefRejectionReason                      });
        // DialysateFlowRate
        institutionalModel.append({ "min"   : vTreatmentRanges.dialysateFlowRateMin,            "max"         : vTreatmentRanges.dialysateFlowRateMax,
                                    "step"  : vTreatmentRanges.dialysateFlowRateRes,            "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.dialysateFlowRateMin,        "rejectionMin": vAdjustmentInstitutionalRecord.dialysateFlowRateMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.dialysateFlowRateMax,        "rejectionMax": vAdjustmentInstitutionalRecord.dialysateFlowRateMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.dialysateFlowRateDef,        "rejectionDef": vAdjustmentInstitutionalRecord.dialysateFlowRateDefRejectionReason                  });
        // TreatmentDuration
        institutionalModel.append({ "min"   : vTreatmentRanges.treatmentDurationMin,            "max"         : vTreatmentRanges.treatmentDurationMax,
                                    "step"  : vTreatmentRanges.treatmentDurationRes,            "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.treatmentDurationMin,        "rejectionMin": vAdjustmentInstitutionalRecord.treatmentDurationMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.treatmentDurationMax,        "rejectionMax": vAdjustmentInstitutionalRecord.treatmentDurationMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.treatmentDurationDef,        "rejectionDef": vAdjustmentInstitutionalRecord.treatmentDurationDefRejectionReason                  });
        // HeparinBolusVolume
        institutionalModel.append({ "min"   : vTreatmentRanges.heparinBolusVolumeMin,           "max"         : vTreatmentRanges.heparinBolusVolumeMax,
                                    "step"  : vTreatmentRanges.heparinBolusVolumeRes,           "decimal"     : Variables.heparinPrecision,     "canOff":   true,
                                    "minVal": vInstitutionalRecord.heparinBolusVolumeMin,       "rejectionMin": vAdjustmentInstitutionalRecord.heparinBolusVolumeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.heparinBolusVolumeMax,       "rejectionMax": vAdjustmentInstitutionalRecord.heparinBolusVolumeMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.heparinBolusVolumeDef,       "rejectionDef": vAdjustmentInstitutionalRecord.heparinBolusVolumeDefRejectionReason                 });
        // HeparinDispenseRate
        institutionalModel.append({ "min"   : vTreatmentRanges.heparinDispensingRateMin,        "max"         : vTreatmentRanges.heparinDispensingRateMax,
                                    "step"  : vTreatmentRanges.heparinDispensingRateRes,        "decimal"     : Variables.heparinPrecision,     "canOff":   true,
                                    "minVal": vInstitutionalRecord.heparinDispensingRateMin,    "rejectionMin": vAdjustmentInstitutionalRecord.heparinDispensingRateMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.heparinDispensingRateMax,    "rejectionMax": vAdjustmentInstitutionalRecord.heparinDispensingRateMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.heparinDispensingRateDef,    "rejectionDef": vAdjustmentInstitutionalRecord.heparinDispensingRateDefRejectionReason              });
        // HeparinStopTime
        institutionalModel.append({ "min"   : vTreatmentRanges.heparinStopTimeMin,              "max"         : vTreatmentRanges.treatmentDurationMax,
                                    "step"  : vTreatmentRanges.treatmentDurationRes,            "decimal"     : 0,                              "canOff":   true,
                                    "minVal": vInstitutionalRecord.heparinStopTimeMin,          "rejectionMin": vAdjustmentInstitutionalRecord.heparinStopTimeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.heparinStopTimeMax,          "rejectionMax": vAdjustmentInstitutionalRecord.heparinStopTimeMaxRejectionReason,
                                    "defVal": _root.none                                                                                                                                            });
        // DialysateTemperature
        institutionalModel.append({ "min"   : vTreatmentRanges.dialysateTempMin,                "max"         : vTreatmentRanges.dialysateTempMax,
                                    "step"  : vTreatmentRanges.dialysateTempRes,                "decimal"     : Variables.dialysateTempPrecision,
                                    "minVal": vInstitutionalRecord.dialysateTempMin,            "rejectionMin": vAdjustmentInstitutionalRecord.dialysateTempMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.dialysateTempMax,            "rejectionMax": vAdjustmentInstitutionalRecord.dialysateTempMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.dialysateTempDef,            "rejectionDef": vAdjustmentInstitutionalRecord.dialysateTempDefRejectionReason                      });
        // AcidCompositionPotassium
        institutionalModel.append({ "min"   : vTreatmentRanges.acidConcentratePotassiumMin,     "max"         : vTreatmentRanges.acidConcentratePotassiumMax,
                                    "step"  : vTreatmentRanges.acidConcentratePotassiumRes,     "decimal"     : Variables.potassiumPrecision,
                                    "minVal": vInstitutionalRecord.acidConcentratePotassiumMin, "rejectionMin": vAdjustmentInstitutionalRecord.acidConcentratePotassiumMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.acidConcentratePotassiumMax, "rejectionMax": vAdjustmentInstitutionalRecord.acidConcentratePotassiumMaxRejectionReason,
                                    "defVal": _root.none,                                                                                                                                           });
        // AcidCompositionCalcium
        institutionalModel.append({ "min"   : vTreatmentRanges.acidConcentrateCalciumMin,       "max"         : vTreatmentRanges.acidConcentrateCalciumMax,
                                    "step"  : vTreatmentRanges.acidConcentrateCalciumRes,       "decimal"     : Variables.calciumPrecision,
                                    "minVal": vInstitutionalRecord.acidConcentrateCalciumMin,   "rejectionMin": vAdjustmentInstitutionalRecord.acidConcentrateCalciumMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.acidConcentrateCalciumMax,   "rejectionMax": vAdjustmentInstitutionalRecord.acidConcentrateCalciumMaxRejectionReason,
                                    "defVal": _root.none                                                                                                                                            });
        // BicarbFinalDialysateComposition
        institutionalModel.append({ "min"   : vTreatmentRanges.dialysateBicarbonateMin,                 "max"         : vTreatmentRanges.dialysateBicarbonateMax,
                                    "step"  : vTreatmentRanges.dialysateBicarbonateRes,                 "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.bicarbFinalDialysateCompositionMin,  "rejectionMin": vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.bicarbFinalDialysateCompositionMax,  "rejectionMax": vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.bicarbFinalDialysateCompositionDef,  "rejectionDef": vAdjustmentInstitutionalRecord.bicarbFinalDialysateCompositionDefRejectionReason    });
        // SodiumFinalDialysateComposition
        institutionalModel.append({ "min"   : vTreatmentRanges.dialysateSodiumMin,                      "max"         : vTreatmentRanges.dialysateSodiumMax,
                                    "step"  : vTreatmentRanges.dialysateSodiumRes,                      "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.sodiumFinalDialysateCompositionMin,  "rejectionMin": vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.sodiumFinalDialysateCompositionMax,  "rejectionMax": vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.sodiumFinalDialysateCompositionDef,  "rejectionDef": vAdjustmentInstitutionalRecord.sodiumFinalDialysateCompositionDefRejectionReason    });
        // FluidBolusVolume
        institutionalModel.append({ "min"   : vTreatmentRanges.salineBolusVolumeMin,                "max"         : vTreatmentRanges.salineBolusVolumeMax,
                                    "step"  : vTreatmentRanges.salineBolusVolumeRes,                "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.fluidBolusVolumeMin,             "rejectionMin": vAdjustmentInstitutionalRecord.fluidBolusVolumeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.fluidBolusVolumeMax,             "rejectionMax": vAdjustmentInstitutionalRecord.fluidBolusVolumeMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.fluidBolusVolumeDef,             "rejectionDef": vAdjustmentInstitutionalRecord.fluidBolusVolumeDefRejectionReason               });
        // ArterialPressureLimit
        institutionalModel.append({ "min"   : vTreatmentRanges.arterialPressureLimitWindowMin,      "max"         : vTreatmentRanges.arterialPressureLimitWindowMax,
                                    "step"  : vTreatmentRanges.arterialPressureLimitWindowRes,      "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.arterialPressureLimitWindowMin,  "rejectionMin": vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.arterialPressureLimitWindowMax,  "rejectionMax": vAdjustmentInstitutionalRecord.arterialPressureLimitWindowMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.arterialPressureLimitWindowDef,  "rejectionDef": vAdjustmentInstitutionalRecord.arterialPressureLimitWindowDefRejectionReason     });
        // VenousPressureLimit
        institutionalModel.append({ "min"   : vTreatmentRanges.venousPressureLimitWindowMin,        "max"         : vTreatmentRanges.venousPressureLimitWindowMax,
                                    "step"  : vTreatmentRanges.venousPressureLimitWindowRes,        "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.venousPressureLimitWindowMin,    "rejectionMin": vAdjustmentInstitutionalRecord.venousPressureLimitWindowMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.venousPressureLimitWindowMax,    "rejectionMax": vAdjustmentInstitutionalRecord.venousPressureLimitWindowMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.venousPressureLimitWindowDef,    "rejectionDef": vAdjustmentInstitutionalRecord.venousPressureLimitWindowDefRejectionReason      });
        // VenousAsymPressureLimit
        institutionalModel.append({ "min"   : vTreatmentRanges.venousPressureLimitAsymtrcMin,       "max"         : vTreatmentRanges.venousPressureLimitAsymtrcMax,
                                    "step"  : vTreatmentRanges.venousPressureLimitAsymtrcRes,       "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.venousPressureLimitAsymtrcMin,   "rejectionMin": vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.venousPressureLimitAsymtrcMax,   "rejectionMax": vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.venousPressureLimitAsymtrcDef,   "rejectionDef": vAdjustmentInstitutionalRecord.venousPressureLimitAsymtrcDefRejectionReason     });
        // TMPWindowLimit
        institutionalModel.append({ "min"   : vTreatmentRanges.trancembrncPressureLimitWindowMin,       "max"         : vTreatmentRanges.trancembrncPressureLimitWindowMax,
                                    "step"  : vTreatmentRanges.trancembrncPressureLimitWindowRes,       "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.trancembrncPressureLimitWindowMin,   "rejectionMin": vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.trancembrncPressureLimitWindowMax,   "rejectionMax": vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.trancembrncPressureLimitWindowDef,   "rejectionDef": vAdjustmentInstitutionalRecord.trancembrncPressureLimitWindowDefRejectionReason });
        // UFVolume
        institutionalModel.append({ "min"   : vTreatmentRanges.ultrafiltrationVolumeMin,            "max"         : vTreatmentRanges.ultrafiltrationVolumeMax,
                                    "step"  : vTreatmentRanges.ultrafiltrationVolumeRes,            "decimal"     : Variables.ultrafiltrationPrecision,
                                    "minVal": vInstitutionalRecord.ultrafiltrationVolumeMin,        "rejectionMin": vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.ultrafiltrationVolumeMax,        "rejectionMax": vAdjustmentInstitutionalRecord.ultrafiltrationVolumeMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.ultrafiltrationVolumeDef,        "rejectionDef": vAdjustmentInstitutionalRecord.ultrafiltrationVolumeDefRejectionReason          });
        // VitalsInterval
        institutionalModel.append({ "min"   : 5,                                        "max" : 60,         "canOff": true,
                                    "minVal": 5,                                        "step": 0,          "decimal": 0,
                                    "maxVal": 60,
                                    "defVal": vInstitutionalRecord.vitalsIntervalDef,   "rejectionDef":    vAdjustmentInstitutionalRecord.vitalsIntervalDefRejectionReason                          });
        // RinsebackVolume
        institutionalModel.append({ "min"   : vTreatmentRanges.rinsebackVolumeMin,          "max"         : vTreatmentRanges.rinsebackVolumeMax,
                                    "step"  : vTreatmentRanges.rinsebackVolumeRes,          "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.rinsebackVolumeMin,      "rejectionMin": vAdjustmentInstitutionalRecord.rinsebackVolumeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.rinsebackVolumeMax,      "rejectionMax": vAdjustmentInstitutionalRecord.rinsebackVolumeMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.rinsebackVolumeDef,      "rejectionDef": vAdjustmentInstitutionalRecord.rinsebackVolumeDefRejectionReason                        });
        // RinsebackFlowRate
        institutionalModel.append({ "min"   : vTreatmentRanges.rinsebackFlowRateMin,        "max"         : vTreatmentRanges.rinsebackFlowRateMax,
                                    "step"  : vTreatmentRanges.rinsebackFlowRateRes,        "decimal"     : 0,
                                    "minVal": vInstitutionalRecord.rinsebackFlowRateMin,    "rejectionMin": vAdjustmentInstitutionalRecord.rinsebackFlowRateMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.rinsebackFlowRateMax,    "rejectionMax": vAdjustmentInstitutionalRecord.rinsebackFlowRateMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.rinsebackFlowRateDef,    "rejectionDef": vAdjustmentInstitutionalRecord.rinsebackFlowRateDefRejectionReason                      });
        // SubstitutionVolume
        institutionalModel.append({ "min"   : vTreatmentRanges.substitutionVolumeMin,       "max"         :    vTreatmentRanges.substitutionVolumeMax,
                                    "step"  : vTreatmentRanges.substitutionVolumeRes,       "decimal"     :  Variables.substitutionPrecision,
                                    "minVal": vInstitutionalRecord.substitutionVolumeMin,   "rejectionMin": vAdjustmentInstitutionalRecord.substitutionVolumeMinRejectionReason,
                                    "maxVal": vInstitutionalRecord.substitutionVolumeMax,   "rejectionMax": vAdjustmentInstitutionalRecord.substitutionVolumeMaxRejectionReason,
                                    "defVal": vInstitutionalRecord.substitutionVolumeDef,   "rejectionDef": vAdjustmentInstitutionalRecord.substitutionVolumeDefRejectionReason                     });
     }

    ListModel { id: institutionalModel }

    component HeaderText: Text { id: _headerText
        property string title   : ""
        property int leftMargin : Variables.defaultMargin * 8.5

        anchors.verticalCenter  : parent.verticalCenter
        leftPadding             : _headerText.leftMargin
        width                   : _listContent.width / 4
        text                    : _headerText.title
        color                   : Colors.white
        font.pixelSize          : Fonts.fontPixelTextRectTitle
        font.weight             : Font.Medium
    }

    contentItem: Item { id: _listContent
        anchors.fill : parent
        readonly property int contentWith: _listView.width - Variables.defaultMargin * 2 // added margin to have scroll bar show on right

        Rectangle { id: _header
            color   : Colors.treatmentSectionHeader
            height  : Variables.institutionaltContainerHeight
            width   : _listContent.contentWith
            radius  : 8.5

            Row {
                width   : _listContent.width
                height  : Variables.institutionaltContainerHeight

                HeaderText { id: _parameters;   title: qsTr("Parameters"); leftMargin: Variables.defaultMargin * 2  }
                HeaderText { id: _minimum;      title: qsTr("Minimum")                                              }
                HeaderText { id: _maximum;      title: qsTr("Maximum")                                              }
                HeaderText { id: _default;      title: qsTr("Default")                                              }
            }

            layer.enabled   : true
            layer.effect: DropShadow {
                id: _dropShadow
                horizontalOffset: 0
                verticalOffset  : 3
                radius          : 3.0
                samples         : 7
                color           : "#50000000"
                source          : _header
                anchors.fill    : _header
            }
        }

        ListView { id: _listView
            anchors {
                top         :_header.bottom
                topMargin   : 10
                left        : parent.left
                right       : parent.right
                bottom      : parent.bottom
            }
            boundsBehavior      : Flickable.StopAtBounds
            clip                : true
            model               : institutionalModel
            spacing             : anchors.topMargin
            flickableDirection  : Flickable.VerticalFlick

            delegate: InstitutionalContainer { id: _delegateControl
                width       : _listContent.contentWith
                text        : _root.title[index] === undefined ? "" : _root.title[index]
                unitText    : _root.unit[index]  === undefined ? "" : _root.unit[index]
                contentArea.anchors.leftMargin  : width * 0.25

                min         : model.min
                max         : model.max
                step        : model.step
                decimal     : model.decimal
                canOff      : model.canOff
                minEditable : _root.canEdit && index !== SettingsInstitutionalRecord.VitalsInterval
                maxEditable : _root.canEdit && index !== SettingsInstitutionalRecord.VitalsInterval
                defEditable : _root.canEdit
                defCustomEditable: _root.canEdit
                minVal      : model.minVal
                maxVal      : model.maxVal
                defVal      : model.defVal
                rejectionMin: model.rejectionMin
                rejectionMax: model.rejectionMax
                rejectionDef: model.rejectionDef
                defText     : index === SettingsInstitutionalRecord.HeparinStopTime ? qsTr("Treatment Duration") :  qsTr("NA")
                defModel    : index === SettingsInstitutionalRecord.VitalsInterval ? ["0", "5", "10", "15", "30", "60"]  : [] // TODO update for Vitals interval FROM STAGING!!!

                onGrabbedChanged: {
                    _listView.interactive = ! grabbed
                }
            }


            ScrollBar { flickable: _listView }
        }
    }
}
