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

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

    Connections { target: vAdjustmentAdvancedInstitutionalRecord
        function onAdjustmentTriggered              ( vValue ) {
            if ( vAdjustmentAdvancedInstitutionalRecord.adjustment_Accepted ) {
                _root.notificationText = qsTr("Advanced Institutional records and preferences updated")
                vAdvancedInstitutionalRecord.doAdjustment()
            }
            else {
                _root.notificationText = qsTr("Error Adjusting Advanced 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
    }

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

                onGrabbedChanged: {
                    _listView.interactive = ! grabbed
                }

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

                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 }
        }
    }
}
