/*!
 *
 * 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    SettingsAdvancedInstitutional.qml
 * \author  (last)      Nico Ramirez
 * \date    (last)      20-Nov-2025
 * \author  (original)  Nico Ramirez
 * \date    (original)  20-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"

SettingsBase    { id: _root
    itemIndex                       : SettingsStack.AdvancedInstitutional
    contentArea.anchors.rightMargin : 0
    property var title              : vAdvancedInstitutionalRecord.parametersTitle
    property var unit               : vAdvancedInstitutionalRecord.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 {
        MinRoRejectionRatio             ,
        DisinfectionFrequency           ,
        DisinfectionParametersCycleTime ,
        MaxBloodPumpStopTime            ,
        InletWaterCondLowThreshold      ,
        InletWaterCondHighThreshold     ,
        ChlorineWaterSampleCheck        ,
        WaterSampleTestResultRequired
    }

    onConfirmClicked: {
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMin              =   getValue(SettingsAdvancedInstitutional.MinRoRejectionRatio)[min]
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMax              =   getValue(SettingsAdvancedInstitutional.MinRoRejectionRatio)[max]
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmDef              =   getValue(SettingsAdvancedInstitutional.MinRoRejectionRatio)[def]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMin                 =   getValue(SettingsAdvancedInstitutional.DisinfectionFrequency)[min]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMax                 =   getValue(SettingsAdvancedInstitutional.DisinfectionFrequency)[max]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyDef                 =   getValue(SettingsAdvancedInstitutional.DisinfectionFrequency)[def]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMin       =   getValue(SettingsAdvancedInstitutional.DisinfectionParametersCycleTime)[min]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMax       =   getValue(SettingsAdvancedInstitutional.DisinfectionParametersCycleTime)[max]
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeDef       =   getValue(SettingsAdvancedInstitutional.DisinfectionParametersCycleTime)[def]
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMin                  =   getValue(SettingsAdvancedInstitutional.MaxBloodPumpStopTime)[min]
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMax                  =   getValue(SettingsAdvancedInstitutional.MaxBloodPumpStopTime)[max]
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeDef                  =   getValue(SettingsAdvancedInstitutional.MaxBloodPumpStopTime)[def]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMin            =   getValue(SettingsAdvancedInstitutional.InletWaterCondLowThreshold)[min]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMax            =   getValue(SettingsAdvancedInstitutional.InletWaterCondLowThreshold)[max]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdDef            =   getValue(SettingsAdvancedInstitutional.InletWaterCondLowThreshold)[def]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMin           =   getValue(SettingsAdvancedInstitutional.InletWaterCondHighThreshold)[min]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMax           =   getValue(SettingsAdvancedInstitutional.InletWaterCondHighThreshold)[max]
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdDef           =   getValue(SettingsAdvancedInstitutional.InletWaterCondHighThreshold)[def]
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMin              =   getValue(SettingsAdvancedInstitutional.ChlorineWaterSampleCheck)[min]
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMax              =   getValue(SettingsAdvancedInstitutional.ChlorineWaterSampleCheck)[max]
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckDef              =   getValue(SettingsAdvancedInstitutional.ChlorineWaterSampleCheck)[def]
        vAdjustmentAdvancedInstitutionalRecord.waterSampleTestResultRequiredDef         =   getValue(SettingsAdvancedInstitutional.WaterSampleTestResultRequired)[defCustom]

        vAdjustmentAdvancedInstitutionalRecord.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() {
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMinRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMaxRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmDefRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMinRejectionReason                =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMaxRejectionReason                =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyDefRejectionReason                =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMinRejectionReason      =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMaxRejectionReason      =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeDefRejectionReason      =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMinRejectionReason                 =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMaxRejectionReason                 =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeDefRejectionReason                 =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMinRejectionReason           =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMaxRejectionReason           =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdDefRejectionReason           =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMinRejectionReason          =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMaxRejectionReason          =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdDefRejectionReason          =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMinRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMaxRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckDefRejectionReason             =   Variables.noRejectReason
        vAdjustmentAdvancedInstitutionalRecord.waterSampleTestResultRequiredDefRejectionReason        =   Variables.noRejectReason
    }

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

    Connections { target: vAdjustmentAdvancedInstitutionalRecord
        function onAdjustmentTriggered              ( vValue ) {
            if ( vAdjustmentAdvancedInstitutionalRecord.adjustment_Accepted ) {
                _root.notificationText = qsTr("Advanced Institutional records and preferences updated")
                clearErrors()
            }
            else {
                _root.notificationText = qsTr("Error Adjusting Advanced 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() {
        advancedInstitutionalModel.clear()
         // Order matters
         // MinRoRejectionRatio
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.minRORejectionRatioAlarmMin,                    "max"         : vTreatmentRanges.minRORejectionRatioAlarmMax,
                                            "step"  : vTreatmentRanges.minRORejectionRatioAlarmRes,                    "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.minRORejectionRatioAlarmMin,        "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.minRORejectionRatioAlarmMax,        "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.minRORejectionRatioAlarmDef,        "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.minRORejectionRatioAlarmDefRejectionReason        });
        // DisinfectionFrequency
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.disinfectionFrequencyMin,                        "max"         : vTreatmentRanges.disinfectionFrequencyMax,
                                            "step"  : vTreatmentRanges.disinfectionFrequencyRes,                        "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.disinfectionFrequencyMin,            "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.disinfectionFrequencyMax,            "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.disinfectionFrequencyDef,            "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.disinfectionFrequencyDefRejectionReason          });
        // DisinfectionParametersCycleTime
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.disinfectionParametersCycleTimeMin,              "max"         : vTreatmentRanges.disinfectionParametersCycleTimeMax,
                                            "step"  : vTreatmentRanges.disinfectionParametersCycleTimeRes,              "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMin,  "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMax,  "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.disinfectionParametersCycleTimeDef,  "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.disinfectionParametersCycleTimeDefRejectionReason});
        // MaxBloodPumpStopTime
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.maxBloodPumpStopTimeMin,                         "max"         : vTreatmentRanges.maxBloodPumpStopTimeMax,
                                            "step"  : vTreatmentRanges.maxBloodPumpStopTimeRes,                         "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.maxBloodPumpStopTimeMin,             "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.maxBloodPumpStopTimeMax,             "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.maxBloodPumpStopTimeDef,             "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.maxBloodPumpStopTimeDefRejectionReason           });
        // InletWaterCondLowThreshold
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.inletWaterCondLowThresholdMin,                   "max"         : vTreatmentRanges.inletWaterCondLowThresholdMax,
                                            "step"  : vTreatmentRanges.inletWaterCondLowThresholdRes,                   "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.inletWaterCondLowThresholdMin,       "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.inletWaterCondLowThresholdMax,       "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.inletWaterCondLowThresholdDef,       "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondLowThresholdDefRejectionReason     });
        // InletWaterCondHighThreshold
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.inletWaterCondHighThresholdMin,                  "max"         : vTreatmentRanges.inletWaterCondHighThresholdMax,
                                            "step"  : vTreatmentRanges.inletWaterCondHighThresholdRes,                  "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.inletWaterCondHighThresholdMin,      "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.inletWaterCondHighThresholdMax,      "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.inletWaterCondHighThresholdDef,      "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.inletWaterCondHighThresholdDefRejectionReason    });
        // ChlorineWaterSampleCheck
        advancedInstitutionalModel.append({ "min"   : vTreatmentRanges.chlorineWaterSampleCheckMin,                     "max"         : vTreatmentRanges.chlorineWaterSampleCheckMax,
                                            "step"  : vTreatmentRanges.chlorineWaterSampleCheckRes,                     "decimal"     : 0,
                                            "minVal": vAdvancedInstitutionalRecord.chlorineWaterSampleCheckMin,         "rejectionMax": vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMaxRejectionReason,
                                            "maxVal": vAdvancedInstitutionalRecord.chlorineWaterSampleCheckMax,         "rejectionMin": vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckMinRejectionReason,
                                            "defVal": vAdvancedInstitutionalRecord.chlorineWaterSampleCheckDef,         "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.chlorineWaterSampleCheckDefRejectionReason       });
        // WaterSampleTestResultRequired
        advancedInstitutionalModel.append({ "min"   : _root.none,                                                       "max"         : _root.none,
                                            "step"  : _root.none,                                                       "decimal"     : 0,
                                            "minVal": _root.none,                                                       "defVal"      : vAdvancedInstitutionalRecord.waterSampleTestResultRequiredDef,
                                            "maxVal": _root.none,                                                       "rejectionDef": vAdjustmentAdvancedInstitutionalRecord.waterSampleTestResultRequiredDefRejectionReason  });
    }

    ListModel { id: advancedInstitutionalModel }

    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
    }

    component RoFeatureIndicator: Rectangle { id: _roFeatureIndicator
        property bool featured   : false

        width   : 12
        height  : width
        radius  : width
        color   : featured ? Colors.roFeatured : Colors.roDefeatured
    }

    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
        Item { id: _roFeatures
            height  : Variables.institutionaltContainerHeight

            HeaderText { id: _roFeatureDescription
                title       : qsTr("RO Featured Devices")
                leftMargin  :  Variables.defaultMargin * 2
                width       : _listContent.contentWith / 6

                RoFeatureIndicator {
                    anchors {
                        left            : parent.left
                        leftMargin      : Variables.defaultMargin
                        verticalCenter  : parent.verticalCenter
                    }
                    featured : true
                }
            }

            HeaderText { id: _roDefeatureDescription
                title       : qsTr("RO Defeatured Devices")
                leftMargin  :  Variables.defaultMargin * 2
                anchors.left: _roFeatureDescription.right
                width       : _listContent.contentWith / 6


                RoFeatureIndicator {
                    anchors {
                        left            : parent.left
                        leftMargin      : Variables.defaultMargin
                        verticalCenter  : parent.verticalCenter
                    }
                    featured : false
                }
            }
        }

        Rectangle { id: _header
            color   : Colors.treatmentSectionHeader
            height  : Variables.institutionaltContainerHeight
            width   : _listContent.contentWith
            radius  : 8.5
            anchors {
                top         :_roFeatures.bottom
                topMargin   : 10
            }

            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               : advancedInstitutionalModel
            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
                minVal      : model.minVal
                maxVal      : model.maxVal
                defVal      : model.defVal
                rejectionMin: model.rejectionMin
                rejectionMax: model.rejectionMax
                rejectionDef: model.rejectionDef
                maxText     : "NA"
                minText     : "NA"
                defModel    : index === SettingsAdvancedInstitutional.WaterSampleTestResultRequired ? vTreatmentRanges.waterSampleTestResultRequired : []

                onGrabbedChanged: {
                    _listView.interactive = ! grabbed
                }

                RoFeatureIndicator {
                    anchors {
                        left        : parent.left
                        leftMargin  : 15
                        top         : parent.top
                        topMargin   : Variables.defaultMargin
                    }
                    featured    : index === SettingsAdvancedInstitutional.InletWaterCondLowThreshold
                    visible     : index === SettingsAdvancedInstitutional.InletWaterCondLowThreshold ||
                                  index === SettingsAdvancedInstitutional.InletWaterCondHighThreshold ||
                                  index === SettingsAdvancedInstitutional.WaterSampleTestResultRequired
                }
            }

            ScrollBar { flickable: _listView }
        }
    }
}
