/*!
 *
 * Copyright (c) 2021-2023 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    AlarmItem.qml
 * \author  (last)      Behrouz NematiPour
 * \date    (last)      02-Feb-2023
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  01-Mar-2021
 *
 */

// Qt
import QtQuick 2.12

// Project
//  C++ imports
import VAlarmStatus     0.1
import VAlarmActiveList 0.1

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

/*!
 * \brief   AlarmItem is the alarm logic container to be separated from the rest of the code.
 *          This item needs to work with the NotificationBar component.
 */
Item { id : _root

    readonly property bool _DEBUG_DISABLE_MAXIMIZE_: false    // due to touch screen issue on some devices, the maximized alarm can't be minimized to see the screen underneath.

    anchors.fill: parent

    VAlarmStatus     { id: vAlarmStatus     }
    VAlarmActiveList { id: vAlarmActiveList }

    readonly property alias  backgroundColor: _alarmDialog.backgroundColor
    readonly property alias  textColor      : _alarmDialog.textColor
    readonly property string title          : vAlarmStatus.title
    readonly property string message        : vAlarmStatus.message
    readonly property alias  isSilenced     : vAlarmStatus.alarm_Flag_alarmsSilenced
    readonly property alias  timeout        : vAlarmStatus.alarm_MuteTimeout
    readonly property alias  alarm_AlarmID  : vAlarmStatus.alarm_AlarmID

    function clearAlarm() {
        vAlarmStatus.doClearCondition()
    }

    function alarmMinimize() {
        // The has alarm check has been added here to let other components call this function,
        // without worrying about the alarmDialog popoing up without an alarm present.
        // Look at the PowerItem as an example.
        if ( ! vAlarmStatus.hasAlarm ) return


        _alarmDialog    .visible = false
        _alarmListDialog.visible = false
        _alarmBar       .visible = true
    }
    function alarmMaximize() {
        // checks if a confirmation is open won't close it by default
        // keep it up until user closes it.
        if ( _powerItem.isOpen       ) return

        // The has alarm check has been added here to let other components call this function,
        // without worrying about the alarmDialog popoing up without an alarm present.
        // Look at the PowerItem as an example.
        if ( ! vAlarmStatus.hasAlarm ) return

        if ( _root._DEBUG_DISABLE_MAXIMIZE_ ) {
            alarmMinimize()
        } else {
            _alarmDialog    .visible = true
            _alarmListDialog.visible = false
            _alarmBar       .visible = false
        }
        _powerItem.cancel()
    }
    function alarmList() {
        vAlarmActiveList.doRequest()
        _alarmDialog    .visible = false
        _alarmListDialog.visible = true
        _alarmBar       .visible = false
    }
    function alarmHide() {
        _alarmDialog    .visible = false
        _alarmListDialog.visible = false
        _alarmBar       .visible = false
    }

    Connections { target: _alarmDialog
        function onMinimizeClicked              (        ) { if ( vAlarmStatus.alarm_Flag_noMinimize ) alarmList    (); else alarmMinimize(); }
    }
    Connections { target: _alarmListDialog
        function onMinimizeClicked              (        ) { if ( vAlarmStatus.alarm_Flag_noMinimize ) alarmMaximize(); else alarmMinimize(); }
    }
    Connections { target: _alarmBar
        function onListClicked                  (        ) { alarmList     () }
        function onMaximizeClicked              (        ) { alarmMaximize () }
        function onClicked                      (        ) { alarmMaximize () }
        function onMuteClicked                  (        ) { vAlarmStatus.doSilence() }
    }
    Connections { target: vAlarmStatus
        function onDidAlarmRaise                (        ) { alarmMaximize  () }
        function onDidAlarmEmpty                (        ) { alarmHide      () }
    }

    // TODO : Later need to create a base Notification dialog class
    //        and inherit NotificationDialog and AlarmListDialog from that
    //        Better be the NotificationDialog defined as parent
    //        and create two separate dialogs by the names of AlarmDialog , AlarmListDlialog.
    //        Same for the NotificationBar
    NotificationDialog { id : _alarmDialog
        // this will change later to the actual message text
        // and the instruction would be in the dialog content

        titleText           :   vAlarmStatus.title
        titlePixelSize      :   Fonts.fontPixelAlarmTitle
        description         :   vAlarmStatus.message
        descriptionPixelSize:   Fonts.fontPixelAlarmMessage
        alarmID             :   vAlarmStatus.alarm_AlarmID
        isSilenced          :   vAlarmStatus.alarm_Flag_alarmsSilenced
        timeout             :   vAlarmStatus.alarm_MuteTimeout
        okVisible           :   vAlarmStatus.alarm_Flag_UserMustAck
        resumeVisible       : ! vAlarmStatus.alarm_Flag_noResume
        rinsebackVisible    : ! vAlarmStatus.alarm_Flag_noRinseback
        endVisible          : ! vAlarmStatus.alarm_Flag_noEndTreatment
        minVisible          : ! vAlarmStatus.alarm_Flag_noMinimize
        titleFading         :   vHDOperationMode.fault
        countDown           :   vTreatmentStop.countDown
        countDownVisible    :   vHDOperationMode.inTreatment && (vHDTreatmentStates.txStop ||  vHDTreatmentStates.txRinseback) && vTreatmentStop.total

        onMuteClicked       : vAlarmStatus.doSilence            ()
        onResumeClicked     : vAlarmStatus.doUserActionResume   ()
        onRinsebackClicked  : vAlarmStatus.doUserActionRinseback()
        onEndClicked        : vAlarmStatus.doUserActionEnd      ()
        onOkClicked         : vAlarmStatus.doUserActionOk       ()
    }

    AlarmListDialog { id : _alarmListDialog
        isSilenced          :   vAlarmStatus.alarm_Flag_alarmsSilenced
        timeout             :   vAlarmStatus.alarm_MuteTimeout
        minVisible          : ! vAlarmStatus.alarm_Flag_noMinimize
        onMuteClicked       :   vAlarmStatus.doSilence()
        titleFading         :   vHDOperationMode.fault
    }

    Connections { target: vAlarmStatus
        function onAlarm_PriorityChanged        ( vValue ) {
            [
                _alarmDialog.titleBarBackground,
                _alarmDialog.titleBarForeground,
                _alarmDialog.backgroundColor   ,
                _alarmDialog.textColor         ,
            ] = Colors.alarmPriorityColors(vValue)
        }
    }
}
