/*!
 *
 * Copyright (c) 2020-2024 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    NotificationDialog.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      17-Apr-2023
 * \author  (original)  Peter Lucia
 * \date    (original)  02-Jun-2020
 *
 */

// Qt
import QtQuick 2.12
import QtGraphicalEffects 1.12

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

/*!
 * \brief   Contains the Alarm Dialog Implementation
 */
ModalDialog { id : _root
    contentItem.objectName: "_NotificationDialog" // SquishQt

    property alias titleText            : _title.text
    property alias titlePixelSize       : _title.font.pixelSize
    property alias  instructionModel    : _listView.model
    property alias titleBarForeground   : _title.color
    property alias titleBarBackground   : _titleBar.color
    property alias isSilenced           : _headerButtonGroup.isSilenced
    property alias timeout              : _headerButtonGroup.timeout
    property int   alarmID              : -1

    property alias countDown            : _timerRect.countDown
    property alias countDownVisible     : _timerRect.visible
    property alias figureImageSource    : _figureImage.source

    property bool  resumeVisible        : false
    property bool  rinsebackVisible     : false
    property bool  temporaryBreakVisible: alarmID === 3   // TODO -- ONLY FOR DEMO - nned to update fw message and add
    property bool  endVisible           : false
    property bool  okVisible            : false
    property bool  minVisible           : true

    property int headerOverlap          : 30

    // Look for this tag: #First_Time_Message_Sent_With_Silenced
    // the isSilenced is helping not to show this dialog maximized and
    // then if the silence is set minimize it immediately
    // this behaviour does not look nice on the screen and it bounces
    radius  : Variables.alarmDialogRadius

    signal muteClicked()
    signal minimizeClicked()
    signal listClicked()

    signal resumeClicked()
    signal temporaryBreakClicked()
    signal rinsebackClicked()
    signal endClicked()
    signal okClicked()

    Rectangle { id: _titleBar
        height  : Variables.alarmDialogHeaderHeight + _root.headerOverlap
        width   : _root.width
        radius  : _root.radius
        clip    : true // the mute button expands so we need to clip the outside unwanted area.

        // TODO: disable doubleClicked later. this is only for diagnostic purpose when alarm dialog covers the entire screen.
        MouseArea { id: _minimizeArea
            anchors.fill    : parent
            onDoubleClicked : { if ( ! _root.minVisible ) _diagnosticsDialog.open() }
        }

        Text { id: _title
            color           : Colors.textMain
            font.pixelSize  : Fonts.fontPixelTitle
            text            : qsTr("Notification")
            font.weight     : Font.DemiBold
            width           : _titleBar.width

            anchors {
                left: parent.left
                leftMargin: Variables.defaultMargin * 2
                verticalCenter: parent.verticalCenter
                verticalCenterOffset: (_root.headerOverlap / 2) * -1
            }
        }

        AlarmButtonRow { id: _headerButtonGroup
            anchors {
                verticalCenter  : _titleBar.verticalCenter
                verticalCenterOffset: (_root.headerOverlap / 2) * -1
                right           : _titleBar.right
                rightMargin     : Variables.defaultMargin * 2
            }

            isMinButton         : true
            backgroundColor     : _titleBar.color
            minMaxVisible       : _root.minVisible

            onMuteClicked       : _root.muteClicked()
            onMinMaxClicked     : _root.minimizeClicked()
            onListClicked       : _root.listClicked()
        }
    }

    Rectangle { id: _descriptionRect
        color   : Colors.offWhite
        clip    : true

        anchors {
            top         : _titleBar.bottom
            topMargin   : _root.headerOverlap * -1
            left        : parent.left
            right       : parent.right
            bottom      : _timerRect.top
        }

        HelpNotification { id: _infoItem
            anchors {
                left        : parent.left
                leftMargin  : Variables.defaultMargin * 4
                top         : parent.top
                topMargin   : Variables.defaultMargin * 3
            }
        }

        ListView {id: _listView
            anchors {
                top         : _infoItem.bottom
                topMargin   : Variables.defaultMargin
                bottom      : parent.bottom
                left        : parent.left
                leftMargin  : Variables.defaultMargin * 4
            }

            height      : _descriptionRect.height
            width       : _descriptionRect.width / 2
            currentIndex: 0
            interactive : false
            clip        : true

            delegate: Item { id: _delegateControl
                width   : _listView.width
                height  : Variables.instructionHeight
                clip    : true

                Rectangle { id: _stepRect
                    height  : 40
                    width   : height
                    radius  : height
                    color   : _delegateControl.ListView.isCurrentItem  ?  Colors.backgroundMainMenu : Colors.offWhite
                    border {
                        color: Colors.backgroundMainMenu
                        width: 2
                    }

                    Text { id: _stepNumberRect
                        anchors.centerIn: parent
                        text            : index + 1
                        color           :  _delegateControl.ListView.isCurrentItem ? Colors.offWhite :  Colors.backgroundMainMenu
                        font.pixelSize  : 20
                        font.weight     : Font.Medium
                    }

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

                Text { id: _delegateText
                    anchors {
                        left        : _stepRect.right
                        leftMargin  : Variables.defaultMargin
                        right       : _delegateControl.right
                    }
                    height          : parent.height
                    width           : parent.width
                    font.pixelSize  : Fonts.fontPixelInstructionStep
                    font.weight     : _delegateControl.ListView.isCurrentItem ? Font.DemiBold : Font.Normal
                    color           : _delegateControl.ListView.isCurrentItem ? "#18559E" : Colors.alarmDialogText
                    text            : model.instruction
                    wrapMode        : Text.WordWrap
                }

                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        if (_listView.currentIndex !== index) {
                            _listView.currentIndex = index
                            _root.figureImageSource = model.image
                        }
                    }
                }
            }
        }

        Image { id: _figureImage
            anchors.right   : parent.right
            anchors.verticalCenter: parent.verticalCenter
        }
    }

    Rectangle { id: _timerRect
        property int countDown : 0

        height: 70
        width: parent.width / 3

        anchors {
            bottom          : _alarmID.top
            bottomMargin    : Variables.defaultMargin * 2
            left            : parent.left
            leftMargin      : Variables.defaultMargin * 4
        }

        color   : "#FFECEC"
        radius  : 10

        Text { id: _astrix
            anchors {
                left: parent.left
                leftMargin: Variables.defaultMargin
                top: _timerDescription.top
            }

            color   : "#AB352E"
            text    : "*"
            font.pixelSize  : 25
            font.weight     : Font.Medium
        }

        Text { id: _timerDescription
            anchors {
                verticalCenter: parent.verticalCenter
                left: _astrix.right
            }

            color   : "black"
            text    :  qsTr("Rinseback will not be allowed in:")
            font.pixelSize  : 25
            font.weight     : Font.Medium

        }

        TimeText { id: _timeoutText
            seconds         : countDown * 60
            anchors {
                verticalCenter  : parent.verticalCenter
                left: _timerDescription.right
            }
            height: _titleBar.height
            textPixelSize   : 35
            textWeight      : Font.Bold
            secondsVisible  : false
            hourZero        : false
            minuteZero      : true
            textColor       : "#AB352E"
        }
    }

    Row { id: _buttonGroup
        property int buttonsWidth   : 350
        spacing: 50

        anchors {
            bottom          : parent.bottom
            horizontalCenter: parent.horizontalCenter
            rightMargin     : spacing
            leftMargin      : spacing
            bottomMargin    : Variables.defaultMargin * 4
        }

        // IMPORTANT NOTE : Alarm Dialog buttons
        // It has been granteed by FW that there should never be more than 3 buttons on the ScreenItem
        // Regarding the discussion there should be only 3 situations:
        // 1 - Different combination of the Resume,Rinseback,End
        // 2 - OK button for user to only ack the alarm
        // 3 - No button at all for the situations that the alarm cannot be resolved by user.
        // :: OK button and the other 3 buttons (Resume,Rinseback,End) should never come together
        TouchRect { id  : _resumeTouchRect
            visible     : resumeVisible
            onPressed   : resumeClicked()
            text.text   : qsTr("Resume")
            width       : _buttonGroup.buttonsWidth
            isDefault   : true
            backgroundColor: Colors.white
            fgColor     : isPressed ? Colors.white : borderColor
            selectColor : Qt.darker(borderColor, 1.15)
            pixelSize   : Fonts.fontPixelNotification
        }

        TouchRect { id  : _temporaryBreak
            visible     : temporaryBreakVisible
            onPressed   : temporaryBreakClicked()
            text.text   : qsTr("Temporary Break")
            width       : _buttonGroup.buttonsWidth
            backgroundColor: Colors.white
            fgColor     : isPressed ? Colors.white : borderColor
            selectColor : Qt.darker(borderColor, 1.15)
            pixelSize   : Fonts.fontPixelNotification
        }

        TouchRect { id  : _rinsebackTouchRect
            visible     : rinsebackVisible
            onPressed   : rinsebackClicked()
            text.text   : qsTr("Return Blood & End Treatment")
            width       : _buttonGroup.buttonsWidth
            backgroundColor: Colors.white
            fgColor     : isPressed ? Colors.white : borderColor
            selectColor : Qt.darker(borderColor, 1.15)
            pixelSize   : Fonts.fontPixelNotification
        }

        TouchRect { id  : _endTouchRect
            visible     : endVisible
            onPressed   : endClicked()
            text.text   : qsTr("End Treatment Only")
            width       : _buttonGroup.buttonsWidth
            backgroundColor: Colors.white
            fgColor     : isPressed ? Colors.white : borderColor
            selectColor : Qt.darker(borderColor, 1.15)
            pixelSize   : Fonts.fontPixelNotification
        }

        TouchRect { id  : _okTouchRect
            visible     : okVisible
            onPressed   : okClicked()
            text.text   : qsTr("OK")
            width       : _buttonGroup.buttonsWidth
            backgroundColor: Colors.white
            fgColor     : isPressed ? Colors.white : borderColor
            selectColor : Qt.darker(borderColor, 1.15)
            pixelSize   : Fonts.fontPixelNotification
        }
    }

    Text { id: _alarmID
        text            :  ("[%1:%2]")  .arg(qsTr("ID"))
                                        .arg(_root.alarmID)
        anchors {
            left        : parent.left
            bottom      : parent.bottom
            leftMargin  : Variables.defaultMargin * 3
            bottomMargin: Variables.defaultMargin
        }
        color           : Colors.alarmDialogGreyText
        font.pixelSize  : Fonts.fontPixelAlarmID
    }

    Connections { target: vAlarmStatus
        function onDidAlarmRaise ( ) {
            // image is out of sync when a new alarm is appears so on new alarm go to step 1 image
            if ( _root.instructionModel.rowCount() > 0) {
                figureImageSource = _root.instructionModel.get(0).image
            }
        }
    }
}
