/*!
 *
 * 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
    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

    // TODO later remove enum and bind listview values
    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 ]
        }
    }

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

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

    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               : vInstitutionalRecord.model
            spacing             : anchors.topMargin
            flickableDirection  : Flickable.VerticalFlick

            delegate: InstitutionalContainer { id: _delegateControl
                width       : _listContent.contentWith
                text        : model.title
                unitText    : model.unit
                contentArea.anchors.leftMargin  : width * 0.25
                min         : model.min ?? 0
                max         : model.max ?? 0
                step        : model.step ?? 0
                decimal     : model.decimal ?? 0
                canOff      : model.canOff
                minEditable : _root.canEdit && index !== SettingsInstitutionalRecord.VitalsInterval
                maxEditable : _root.canEdit && index !== SettingsInstitutionalRecord.VitalsInterval
                defEditable : _root.canEdit
                defCustomEditable: _root.canEdit
                minVal      : model.minVal ?? 0
                maxVal      : model.maxVal ?? 0
                defVal      : model.defVal ?? 0
                rejectionMin: model.rejectionMin ?? 0
                rejectionMax: model.rejectionMax ?? 0
                rejectionDef: model.rejectionDef ?? 0
                defText     : index === SettingsInstitutionalRecord.HeparinStopTime ? qsTr("Treatment Duration") :  qsTr("NA")
                defModel    : index === SettingsInstitutionalRecord.VitalsInterval ? vTreatmentRanges.bloodPressureMeasureInterval : []

                onGrabbedChanged: {
                    _listView.interactive = ! grabbed
                }

                onDidChange: function (vValue) {
                    vInstitutionalRecord.clearRejectionReason( index , vValue )
                }
            }

            ScrollBar { flickable: _listView }
        }
    }
}
