using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Tango.Core.Commands;
using Tango.Core.Helpers;
using Tango.PPC.Common;
using Tango.PPC.Common.MachineUpdate;
using Tango.PPC.UI.ViewsContracts;
namespace Tango.PPC.UI.ViewModels
{
public class MachineUpdateViewVM : PPCViewModel<IMachineUpdateView>
{
public enum MachineUpdateView
{
UpdateCheckView,
UpdateCheckErrorView,
UpdateAvailableView,
UpToDateView,
UpdateProgressView,
UpdateDbProgressView,
UpdateCompletedView,
UpdateFailedView,
}
private MachineUpdateResult _update_result;
private DbCompareResult _db_compare_result;
#region Properties
/// <summary>
/// Gets or sets the machine update manager.
/// </summary>
public IMachineUpdateManager MachineUpdateManager { get; set; }
private String _latestVersion;
/// <summary>
/// Gets or sets the latest version.
/// </summary>
public String LatestVersion
{
get { return _latestVersion; }
set { _latestVersion = value; RaisePropertyChangedAuto(); }
}
private bool _isDbUpdate;
/// <summary>
/// Gets or sets a value indicating whether this instance is database update.
/// </summary>
public bool IsDbUpdate
{
get { return _isDbUpdate; }
set { _isDbUpdate = value; RaisePropertyChangedAuto(); }
}
#endregion
#region Commands
/// <summary>
/// Gets or sets the complete command.
/// </summary>
public RelayCommand CompleteCommand { get; set; }
/// <summary>
/// Gets or sets the install command.
/// </summary>
public RelayCommand UpdateCommand { get; set; }
/// <summary>
/// Gets or sets the restart command.
/// </summary>
public RelayCommand RestartCommand { get; set; }
/// <summary>
/// Gets or sets the close command.
/// </summary>
public RelayCommand CloseCommand { get; set; }
/// <summary>
/// Gets or sets to application command.
/// </summary>
public RelayCommand ToApplicationCommand { get; set; }
#endregion
#region Constructors
public MachineUpdateViewVM(IMachineUpdateManager machineUpdateManager)
{
MachineUpdateManager = machineUpdateManager;
CompleteCommand = new RelayCommand(CompleteUpdate);
UpdateCommand = new RelayCommand(Update);
RestartCommand = new RelayCommand(CheckForUpdates);
CloseCommand = new RelayCommand(() =>
{
NavigationManager.NavigateTo(Common.Navigation.NavigationView.HomeModule);
NavigateTo(MachineUpdateView.UpdateCheckView);
});
ToApplicationCommand = new RelayCommand(() =>
{
NavigationManager.NavigateTo(Common.Navigation.NavigationView.HomeModule);
NavigateTo(MachineUpdateView.UpdateCheckView);
});
}
#endregion
#region Update
public async void CheckForUpdates()
{
await NavigateTo(MachineUpdateView.UpdateCheckView);
try
{
IsDbUpdate = false;
var response = await MachineUpdateManager.CheckForUpdate(MachineProvider.Machine.SerialNumber, "http://localhost:51581/");
if (response.IsUpdateAvailable)
{
LatestVersion = response.Version;
await NavigateTo(MachineUpdateView.UpdateAvailableView);
}
else
{
_db_compare_result = await MachineUpdateManager.UpdateDBCheck(MachineProvider.Machine.SerialNumber, "http://localhost:51581/");
if (_db_compare_result.RequiresUpdate)
{
IsDbUpdate = true;
await NavigateTo(MachineUpdateView.UpdateAvailableView);
}
else
{
await NavigateTo(MachineUpdateView.UpToDateView);
}
}
}
catch (Exception ex)
{
LogManager.Log(ex, "Error while trying to check for updates.");
await NavigateTo(MachineUpdateView.UpdateFailedView);
}
}
private async void Update()
{
if (!IsDbUpdate)
{
await NavigateTo(MachineUpdateView.UpdateProgressView);
LogManager.Log("Starting machine update...");
try
{
_update_result = await MachineUpdateManager.Update(MachineProvider.Machine.SerialNumber, "http://localhost:51581/");
LogManager.Log("Machine update completed.");
await NavigateTo(MachineUpdateView.UpdateCompletedView);
}
catch (Exception ex)
{
LogManager.Log(ex, "Machine update failed.");
await NavigateTo(MachineUpdateView.UpdateFailedView);
}
}
else
{
await NavigateTo(MachineUpdateView.UpdateDbProgressView);
LogManager.Log("Starting database update...");
try
{
await MachineUpdateManager.UpdateDB(_db_compare_result);
LogManager.Log("Database update completed.");
await NavigateTo(MachineUpdateView.UpToDateView);
}
catch (Exception ex)
{
LogManager.Log(ex, "Database update failed.");
await NavigateTo(MachineUpdateView.UpdateFailedView);
}
}
}
#endregion
#region Complete
private void CompleteUpdate()
{
String updater_exe = Path.Combine(_update_result.UpdatePackagePath, "Tango.PPC.Updater.exe");
LogManager.Log("Completing machine setup...");
LogManager.Log($"Executing '{updater_exe}' with arguments '{PathHelper.GetStartupPath()}'...");
Process.Start(updater_exe, PathHelper.GetStartupPath());
LogManager.Log("Terminating application process!");
Environment.Exit(0);
}
#endregion
public override void OnApplicationStarted()
{
}
/// <summary>
/// Navigates to the specified view.
/// </summary>
/// <param name="view">The view.</param>
private Task NavigateTo(MachineUpdateView view)
{
return View.NavigateTo(view);
}
}
}