using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Collections.Specialized;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Data;
using Tango.BL.Entities;
using Tango.Core;
using Tango.Core.DI;
using Tango.FSE.Common.Connection;
using Tango.FSE.Common.Events;
using Tango.FSE.Common.Navigation;
using Tango.FSE.Common.Notifications;
using Tango.FSE.Common.Threading;
using Tango.FSE.UI.ViewModels;
using Tango.FSE.UI.Views;
using Tango.PMR.Diagnostics;
using Tango.PPC.Shared.Events;
namespace Tango.FSE.UI.Events
{
///
/// Represents the default implementation.
///
///
///
public class DefaultEventsProvider : ExtendedObject, IEventsProvider
{
private Dictionary _snackbarItems;
private const int MAX_HISTORY = 100;
private IMachineProvider MachineProvider { get; set; }
[TangoInject]
private IDispatcherProvider Dispatcher { get; set; }
[TangoInject]
private INotificationProvider NotificationProvider { get; set; }
private INavigationManager NavigationManager { get; set; }
///
/// Gets or sets the events history (resolved events).
///
public ObservableCollection EventsHistory { get; set; }
///
/// Gets or sets the current active events.
///
public ObservableCollection ActiveEvents { get; set; }
///
/// Gets or sets the active events view.
///
public ICollectionView ActiveEventsView { get; set; }
///
/// Gets or sets the events history view.
///
public ICollectionView EventsHistoryView { get; set; }
///
/// Gets a value indicating whether there are any active events currently.
///
public bool HasActiveEvents
{
get { return ActiveEvents.Count > 0; }
}
///
/// Initializes a new instance of the class.
///
/// The machine provider.
public DefaultEventsProvider(IMachineProvider machineProvider, INavigationManager navigationManager)
{
_snackbarItems = new Dictionary();
//Active Events.
ActiveEvents = new ObservableCollection();
ActiveEvents.CollectionChanged += ActiveEvents_CollectionChanged;
ActiveEventsView = CollectionViewSource.GetDefaultView(ActiveEvents);
ActiveEventsView.SortDescriptions.Add(new SortDescription(nameof(MachinesEvent.Category), ListSortDirection.Descending));
//Events History
EventsHistory = new ObservableCollection();
EventsHistoryView = CollectionViewSource.GetDefaultView(EventsHistory);
EventsHistoryView.SortDescriptions.Add(new SortDescription(nameof(MachinesEvent.DateTime), ListSortDirection.Descending));
MachineProvider = machineProvider;
MachineProvider.MachineOperator.MachineEventsStateProvider.NewEvents += MachineEventsStateProvider_NewEvents;
MachineProvider.MachineOperator.MachineEventsStateProvider.EventsResolved += MachineEventsStateProvider_EventsResolved;
MachineProvider.MachineDisconnected += MachineProvider_MachineDisconnected;
MachineProvider.MachineConnected += MachineProvider_MachineConnected;
NavigationManager = navigationManager;
NavigationManager.Navigating += NavigationManager_Navigating;
}
private void NavigationManager_Navigating(object sender, NavigationToEventArgs e)
{
if (e.ToVM != null && e.ToVM.GetType() == typeof(EventsViewVM))
{
foreach (var item in _snackbarItems.ToList())
{
NotificationProvider.PopSnackbarItem(item.Value);
_snackbarItems.Remove(item.Key);
}
}
}
private void MachineProvider_MachineConnected(object sender, MachineConnectedEventArgs e)
{
if (e.DifferentFromPrevious)
{
Dispatcher.Invoke(() =>
{
EventsHistory.Clear();
});
}
}
private void MachineProvider_MachineDisconnected(object sender, MachineDisconnectedEventArgs e)
{
Dispatcher.Invoke(() =>
{
ActiveEvents.Clear();
});
}
private void MachineEventsStateProvider_EventsResolved(object sender, IEnumerable events)
{
Dispatcher.Invoke(() =>
{
foreach (var ev in events.ToList())
{
if (!ev.EventType.Persistent)
{
ActiveEvents.Remove(ev);
EventsHistory.Insert(0, ev);
}
if (EventsHistory.Count > MAX_HISTORY)
{
EventsHistory.Remove(EventsHistory.Last());
}
if (!ev.EventType.Persistent)
{
if (_snackbarItems.ContainsKey(ev))
{
NotificationProvider.PopSnackbarItem(_snackbarItems[ev]);
_snackbarItems.Remove(ev);
}
}
}
});
}
private void MachineEventsStateProvider_NewEvents(object sender, IEnumerable events)
{
Dispatcher.Invoke(() =>
{
foreach (var ev in events.ToList())
{
if (!ev.EventType.Persistent)
{
ActiveEvents.Insert(0, ev);
}
else
{
EventsHistory.Insert(0, ev);
}
if (NavigationManager.CurrentVM != null && NavigationManager.CurrentVM.GetType() == typeof(EventsViewVM))
{
continue;
}
MessageType messageType = MessageType.Info;
TimeSpan timeout = TimeSpan.FromSeconds(10);
switch (ev.Category)
{
case Tango.BL.Enumerations.EventTypeCategories.Info:
messageType = MessageType.Info;
break;
case Tango.BL.Enumerations.EventTypeCategories.Warning:
messageType = MessageType.Warning;
break;
case Tango.BL.Enumerations.EventTypeCategories.Error:
messageType = MessageType.Error;
break;
case Tango.BL.Enumerations.EventTypeCategories.Critical:
messageType = MessageType.Error;
timeout = TimeSpan.FromSeconds(30);
break;
case Tango.BL.Enumerations.EventTypeCategories.Success:
messageType = MessageType.Success;
break;
}
var item = NotificationProvider.PushSnackbarItem(
messageType,
ev.EventType.GetEventText(Tango.BL.Entities.EventType.EventTextType.Title, MachineProvider.Machine),
true,
ev.EventType.Name + "\n" + ev.EventType.GetEventText(Tango.BL.Entities.EventType.EventTextType.Description, MachineProvider.Machine),
timeout,
null,
() =>
{
NavigationManager.NavigateWithObject(new EventsViewVM.NavigationObject()
{
SelectedEvent = ev
});
});
_snackbarItems[ev] = item;
}
});
}
private void ActiveEvents_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
RaisePropertyChanged(nameof(HasActiveEvents));
}
public async Task PushEmulatedEvent(Event ev, TimeSpan timeout)
{
await MachineProvider.MachineOperator.SendGenericRequest(new PushEmulatedEventRequest()
{
Event = ev,
Timeout = timeout
});
}
}
}