using Avalonia.Threading;
using ReactiveUI;
using SPTInstaller.Interfaces;
using System;
using System.Threading.Tasks;
namespace SPTInstaller.Models
{
public abstract class InstallerTaskBase : ReactiveObject, IProgressableTask
{
private string _id;
public string Id
{
get => _id;
private set => this.RaiseAndSetIfChanged(ref _id, value);
}
private string _name;
public string Name
{
get => _name;
private set => this.RaiseAndSetIfChanged(ref _name, value);
}
private bool _isComleted;
public bool IsCompleted
{
get => _isComleted;
private set => this.RaiseAndSetIfChanged(ref _isComleted, value);
}
private bool _hasErrors;
public bool HasErrors
{
get => _hasErrors;
private set => this.RaiseAndSetIfChanged(ref _hasErrors, value);
}
private bool _isRunning;
public bool IsRunning
{
get => _isRunning;
private set => this.RaiseAndSetIfChanged(ref _isRunning, value);
}
private int _progress;
public int Progress
{
get => _progress;
private set => this.RaiseAndSetIfChanged(ref _progress, value);
}
private bool _showProgress;
public bool ShowProgress
{
get => _showProgress;
private set => this.RaiseAndSetIfChanged(ref _showProgress, value);
}
private string _statusMessage;
public string StatusMessage
{
get => _statusMessage;
private set => this.RaiseAndSetIfChanged(ref _statusMessage, value);
}
private string _statusDetails;
public string StatusDetails
{
get => _statusDetails;
private set => this.RaiseAndSetIfChanged(ref _statusDetails, value);
}
///
/// Update the status message and optionally a progress bar value
///
///
///
/// If message is empty, it isn't updated. If progress is null, the progress bar will be hidden. Details is not touched with this method
public void SetStatus(string message, int? progress = null) => SetStatus(message, "", progress);
///
/// Update the status message, status details, and optionlly a progress bar value
///
///
///
/// If message or details are empty, it isn't updated. If progress is null, the progress bar will be hidden
public void SetStatus(string message, string details, int? progress = null)
{
StatusMessage = String.IsNullOrWhiteSpace(message) ? StatusMessage : message;
StatusDetails = String.IsNullOrWhiteSpace(details) ? StatusDetails : details;
ShowProgress = progress != null;
if (progress != null)
{
Progress = progress.Value;
}
}
public InstallerTaskBase(string name)
{
Name = name;
Id = Guid.NewGuid().ToString();
}
///
/// A method for the install controller to call. Do not use this within your task
///
///
public async Task RunAsync()
{
IsRunning = true;
var result = await TaskOperation();
IsRunning = false;
if (!result.Succeeded)
{
// TODO: handle error state
}
IsCompleted = true;
return result;
}
///
/// The task you want to run
///
///
public abstract Task TaskOperation();
}
}