using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.BL;
using Tango.BL.ActionLogs;
using Tango.BL.Builders;
using Tango.BL.Entities;
using Tango.Core.Commands;
using Tango.Core.Threading;
using Tango.MachineStudio.Common;
using Tango.MachineStudio.Common.Authentication;
using Tango.MachineStudio.Common.Notifications;
using Tango.MachineStudio.Sites.Contracts;
using Tango.MachineStudio.Sites.Models;
namespace Tango.MachineStudio.Sites.ViewModels
{
public class MainViewVM : StudioViewModel<IMainView>
{
private ObservablesContext _db;
private INotificationProvider _notification;
private IAuthenticationProvider _authentication;
private IActionLogManager _actionLogManager;
private ActionTimer _filter_timer;
private List<SiteModel> _sites;
public List<SiteModel> Sites
{
get { return _sites; }
set { _sites = value; RaisePropertyChangedAuto(); }
}
private SiteModel _selectedSite;
public SiteModel SelectedSite
{
get { return _selectedSite; }
set { _selectedSite = value; RaisePropertyChangedAuto(); InvalidateRelayCommands(); }
}
private String _filter;
public String Filter
{
get { return _filter; }
set { _filter = value; RaisePropertyChangedAuto(); OnFilterChanged(); }
}
private SiteDetailsViewVM _siteDetailsViewVM;
public SiteDetailsViewVM SiteDetailsViewVM
{
get { return _siteDetailsViewVM; }
set { _siteDetailsViewVM = value; RaisePropertyChangedAuto(); }
}
public RelayCommand AddSiteCommand { get; set; }
public RelayCommand RemoveSiteCommand { get; set; }
public RelayCommand ManageSiteCommand { get; set; }
public RelayCommand BackToSitesCommand { get; set; }
public MainViewVM(INotificationProvider notificationProvider, IAuthenticationProvider authentication, IActionLogManager actionLogManager)
{
_notification = notificationProvider;
_authentication = authentication;
_actionLogManager = actionLogManager;
_filter_timer = new ActionTimer(TimeSpan.FromMilliseconds(500));
ManageSiteCommand = new RelayCommand(() => LoadSelectedSite(), () => SelectedSite != null);
BackToSitesCommand = new RelayCommand(() => { View.NavigateTo(SitesNavigationView.SitesView); });
AddSiteCommand = new RelayCommand(AddNewSite);
RemoveSiteCommand = new RelayCommand(RemoveSelectedSite, () => SelectedSite != null);
}
private async void RemoveSelectedSite()
{
if (!_notification.ShowQuestion("Are you sure you wish to remove the selected site?")) return;
try
{
using (_notification.PushTaskItem("Removing site..."))
{
IsFree = false;
await Task.Factory.StartNew(() =>
{
var site = _db.Sites.SingleOrDefault(x => x.Guid == SelectedSite.Guid);
site.Delete(_db);
_db.SaveChanges();
_actionLogManager.InsertLog(BL.Enumerations.ActionLogType.SiteDeleted, _authentication.CurrentUser, site.Name, site, "Site deleted using Machine Studio.");
Sites.Remove(SelectedSite);
LoadSites();
});
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error removing site.");
_notification.ShowError($"Error removing site.\n{ex.FlattenMessage()}");
}
finally
{
IsFree = true;
}
}
private async void AddNewSite()
{
try
{
String name = _notification.ShowTextInput("Enter site name", "name");
if (String.IsNullOrWhiteSpace(name)) return;
using (_notification.PushTaskItem("Creating site..."))
{
IsFree = false;
SiteDetailsViewVM = new SiteDetailsViewVM();
SiteDetailsViewVM.Saved += SiteDetailsViewVM_Saved;
await SiteDetailsViewVM.Init(SelectedSite?.Guid, _notification, _authentication, _actionLogManager, true, name);
View.NavigateTo(SitesNavigationView.SiteDetailsView);
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error creating site.");
_notification.ShowError($"Error creating site.\n{ex.FlattenMessage()}");
}
finally
{
IsFree = true;
}
}
private async void LoadSelectedSite()
{
try
{
using (_notification.PushTaskItem("Loading site details..."))
{
IsFree = false;
SiteDetailsViewVM = new SiteDetailsViewVM();
SiteDetailsViewVM.Saved += SiteDetailsViewVM_Saved;
await SiteDetailsViewVM.Init(SelectedSite.Guid, _notification, _authentication, _actionLogManager, false);
View.NavigateTo(SitesNavigationView.SiteDetailsView);
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error loading site details.");
_notification.ShowError($"Error loading site details.\n{ex.FlattenMessage()}");
}
finally
{
IsFree = true;
}
}
private void SiteDetailsViewVM_Saved(object sender, EventArgs e)
{
OnFilterChanged();
View.NavigateTo(SitesNavigationView.SitesView);
}
private void OnFilterChanged()
{
if (Filter != null)
{
_filter_timer.ResetReplace(() =>
{
try
{
LoadSites();
}
catch (Exception ex)
{
LogManager.Log(ex, "Error loading sites list.");
}
});
}
}
private void LoadSites()
{
using (_notification.PushTaskItem("Loading sites..."))
{
Sites = (from site in _db.Sites
join organization in _db.Organizations on site.OrganizationGuid equals organization.Guid
join sites_rmls in _db.SitesRmls on site.Guid equals sites_rmls.SiteGuid into rmls
join sites_catalogs in _db.SitesCatalogs on site.Guid equals sites_catalogs.SiteGuid into catalogs
join sites_machines in _db.Machines on site.Guid equals sites_machines.SiteGuid into machines
where Filter == null || Filter == "" || site.Name.ToLower().StartsWith(Filter.ToLower()) || organization.Name.ToLower().StartsWith(Filter.ToLower())
select new
{
Site = site,
OrganizationName = organization.Name,
ThreadCount = rmls.Count(x => x.SiteGuid == site.Guid),
CatalogCount = catalogs.Count(x => x.SiteGuid == site.Guid),
MachineCount = machines.Count(x => x.SiteGuid == site.Guid)
}).Distinct().ToList().DistinctBy(x => x.Site.Guid).Select(x => new SiteModel()
{
Guid = x.Site.Guid,
ID = x.Site.ID,
Name = x.Site.Name,
Description = x.Site.Description,
ThreadCount = x.ThreadCount,
CatalogCount = x.CatalogCount,
MachineCount = x.MachineCount,
Organization = x.OrganizationName,
}).ToList();
}
}
public override void OnApplicationReady()
{
_db = ObservablesContext.CreateDefault();
}
}
}