using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.BL.Entities;
using Tango.BL.Enumerations;
using Tango.PPC.Common;
using Tango.PPC.Common.Notifications;
using Tango.PPC.Common.Notifications.NotificationItems;
using Tango.PPC.Events.Enumerations;
using System.Data.Entity;
using Tango.Integration.Operation;
namespace Tango.PPC.Events.ViewModels
{
///
/// Represents the main view VM and entry point for .
///
///
public class MainViewVM : PPCViewModel
{
private List> _notifications;
private EventsSource _selectedEventsSource;
public EventsSource SelectedEventsSource
{
get { return _selectedEventsSource; }
set { _selectedEventsSource = value; RaisePropertyChangedAuto(); }
}
private ObservableCollection _currentEvents;
///
/// Gets or sets the current events.
///
public ObservableCollection CurrentEvents
{
get { return _currentEvents; }
set { _currentEvents = value; RaisePropertyChangedAuto(); }
}
private MachinesEvent _selectedEvent;
///
/// Gets or sets the selected event.
///
public MachinesEvent SelectedEvent
{
get { return _selectedEvent; }
set { _selectedEvent = value; RaisePropertyChangedAuto(); }
}
private ObservableCollection _historyEvents;
///
/// Gets or sets the history events.
///
public ObservableCollection HistoryEvents
{
get { return _historyEvents; }
set { _historyEvents = value; RaisePropertyChangedAuto(); }
}
private MachinesEvent _selectedHistoryEvent;
///
/// Gets or sets the selected event.
///
public MachinesEvent SelectedHistoryEvent
{
get { return _selectedHistoryEvent; }
set { _selectedHistoryEvent = value; RaisePropertyChangedAuto(); }
}
///
/// Initializes a new instance of the class.
///
public MainViewVM()
{
CurrentEvents = new ObservableCollection();
_notifications = new List>();
}
///
/// Called when the application has been started
///
public override void OnApplicationStarted()
{
EventLogger.EventReceived += EventLogger_EventReceived;
EventLogger.EventResolved += EventLogger_EventResolved;
}
public override async void OnApplicationReady()
{
base.OnApplicationReady();
using (var db = ObservablesContext.CreateDefault())
{
var last_week = DateTime.UtcNow.AddDays(-7);
HistoryEvents = (await db.MachinesEvents.Where(x => x.MachineGuid == MachineProvider.Machine.Guid && x.DateTime > last_week).Take(100).Include(x => x.EventType).Where(x => (EventTypeNotificationTimes)x.EventType.EventNotificationTime != EventTypeNotificationTimes.None || x.EventType.Code == (int)EventTypes.JOB_FAILED || x.EventType.Code == (int)EventTypes.JOB_STARTED || x.EventType.Code == (int)EventTypes.JOB_COMPLETED || x.EventType.Code == (int)EventTypes.JOB_ABORTED).ToListAsync()).OrderByDescending(x => x.DateTime).ToObservableCollection();
}
MachineProvider.MachineOperator.StatusChanged += MachineOperator_StatusChanged;
}
private void MachineOperator_StatusChanged(object sender, MachineStatuses status)
{
if (status == MachineStatuses.Disconnected)
{
foreach (var notification in _notifications.ToList())
{
NotificationProvider.PopNotification(notification.Value);
}
_notifications.Clear();
InvokeUI(() =>
{
CurrentEvents.Clear();
});
}
}
private void EventLogger_EventReceived(object sender, MachinesEvent ev)
{
InvokeUI(() =>
{
if (ev.NotificationTime != EventTypeNotificationTimes.None)
{
if (!ev.EventType.Persistent)
{
CurrentEvents.Insert(0, ev);
}
else
{
HistoryEvents.Insert(0, ev);
}
var notificationItem = new MessageNotificationItem();
notificationItem.CanClose = ev.EventType.Persistent;
notificationItem.Message = ev.EventType.GetEventText(EventType.EventTextType.Title, MachineProvider.Machine);
notificationItem.ExpandedMessage = ev.EventType.GetEventText(EventType.EventTextType.Description, MachineProvider.Machine);
notificationItem.Pressed += async (_, __) =>
{
if (!ev.EventType.Persistent)
{
SelectedEventsSource = EventsSource.CURRENT;
}
else
{
SelectedEventsSource = EventsSource.HISTORY;
notificationItem.Dispose();
}
SelectedEvent = ev;
await NavigationManager.NavigateTo();
};
switch (ev.Category)
{
case EventTypeCategories.Info:
notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Info;
notificationItem.Priority = NotificationItem.NotificationPriority.Normal;
break;
case EventTypeCategories.Warning:
notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Warning;
notificationItem.Priority = NotificationItem.NotificationPriority.High;
break;
case EventTypeCategories.Error:
notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Error;
notificationItem.Priority = NotificationItem.NotificationPriority.VeryHigh;
break;
case EventTypeCategories.Critical:
notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Critical;
notificationItem.Priority = NotificationItem.NotificationPriority.Critical;
break;
case EventTypeCategories.Success:
notificationItem.MessageType = MessageNotificationItem.MessageNotificationItemTypes.Success;
notificationItem.Priority = NotificationItem.NotificationPriority.VeryHigh;
break;
}
NotificationProvider.PushNotification(notificationItem);
_notifications.Add(new KeyValuePair(ev.EventType.Type, notificationItem));
}
else if (ev.IsJobProgressEvent())
{
HistoryEvents.Insert(0, ev);
}
});
}
private void EventLogger_EventResolved(object sender, MachinesEvent ev)
{
InvokeUI(() =>
{
if (ev.NotificationTime != EventTypeNotificationTimes.None && !ev.EventType.Persistent)
{
CurrentEvents.Remove(ev);
HistoryEvents.Insert(0, ev);
foreach (var item in _notifications.ToList().Where(x => x.Key == ev.EventType.Type))
{
_notifications.Remove(item);
NotificationProvider.PopNotification(item.Value);
}
if (HistoryEvents.Count > 100)
{
HistoryEvents.Remove(HistoryEvents.Last());
}
}
});
}
public override void OnNavigatedTo()
{
base.OnNavigatedTo();
NotificationProvider.NotificationsVisible = false;
}
public override void OnNavigatedFrom()
{
base.OnNavigatedFrom();
NotificationProvider.NotificationsVisible = true;
}
}
}