/*!
 *
 * Copyright (c) 2019-2020 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)      28-Feb-2021
 * \author  (original)  Behrouz NematiPour
 * \date    (original)  28-Feb-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
    anchors.fill: parent

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

    readonly property alias backgroundColor: _alarmDialog.backgroundColor
    readonly property alias textColor      : _alarmDialog.textColor
    readonly property alias text           : vAlarmStatus.text
    readonly property alias isSilenced     : vAlarmStatus.alarm_Flag_alarmsSilenced
    readonly property alias timeout        : vAlarmStatus.alarm_MuteTimeout

    function clearAlarm() {
        vAlarmStatus.doClearCondition()
    }

    // Alarms dialog/bar navigation handling ----- vvvvv -----
    function alarmMinimize() {
        _alarmDialog    .visible = false
        _alarmListDialog.visible = false
        _alarmBar       .visible = true
    }
    function alarmMaximize() {
        // 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 = true
        _alarmListDialog.visible = false
        _alarmBar       .visible = false
    }
    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
        onMinimizeClicked   : vAlarmStatus.alarm_Flag_noMinimize ? alarmList()      : alarmMinimize()
    }
    Connections { target: _alarmListDialog
        onMinimizeClicked   : vAlarmStatus.alarm_Flag_noMinimize ? alarmMaximize()  : alarmMinimize()
    }
    Connections { target: _alarmBar
        onListClicked       : alarmList()
        onMaximizeClicked   : alarmMaximize()
        onClicked           : alarmMaximize()
    }
    Connections { target: vAlarmStatus
        onDidAlarmRaise: alarmMaximize()
        onDidAlarmEmpty: alarmHide()
    }
    // ----- ^^^^^ -----

    Connections { target: _alarmBar
        onMuteClicked       : vAlarmStatus.doSilence()
    }

    // 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           :   qsTr("Alarm") + " " + "[" + vAlarmStatus.alarm_AlarmID + "]"
        description         :   vAlarmStatus.text
        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    :   vHDTreatmentStates.txStop && 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
        onAlarm_PriorityChanged: [
            _alarmDialog.titleBarBackground,
            _alarmDialog.titleBarForeground,
            _alarmDialog.backgroundColor   ,
            _alarmDialog.textColor         ,
        ] = Colors.alarmPriorityColors(vAlarmStatus.alarm_Priority)
    }
}
