using ReactiveUI;
using SPTInstaller.CustomControls;
using SPTInstaller.Interfaces;
using System.Threading.Tasks;
using System.Windows.Input;
namespace SPTInstaller.Models;
public abstract class PreCheckBase : ReactiveObject, IPreCheck
{
public event EventHandler ReeevaluationRequested = delegate { };
private string _id;
public string Id
{
get => _id;
set => this.RaiseAndSetIfChanged(ref _id, value);
}
private bool _isSelected;
public bool IsSelected
{
get => _isSelected;
set => this.RaiseAndSetIfChanged(ref _isSelected, value);
}
private string _name;
public string Name
{
get => _name;
set => this.RaiseAndSetIfChanged(ref _name, value);
}
private bool _required;
public bool IsRequired
{
get => _required;
set => this.RaiseAndSetIfChanged(ref _required, value);
}
private StatusSpinner.SpinnerState _state;
public StatusSpinner.SpinnerState State
{
get => _state;
set => this.RaiseAndSetIfChanged(ref _state, value);
}
private string _preCheckDetails;
public string PreCheckDetails
{
get => _preCheckDetails;
set => this.RaiseAndSetIfChanged(ref _preCheckDetails, value);
}
private bool _actionButtonIsVisible;
public bool ActionButtonIsVisible
{
get => _actionButtonIsVisible;
set => this.RaiseAndSetIfChanged(ref _actionButtonIsVisible, value);
}
private string _actionButtonText;
public string ActionButtonText
{
get => _actionButtonText;
set => this.RaiseAndSetIfChanged(ref _actionButtonText, value);
}
private ICommand _actionButtonCommand;
public ICommand ActionButtonCommand
{
get => _actionButtonCommand;
set => this.RaiseAndSetIfChanged(ref _actionButtonCommand, value);
}
///
/// Base class for pre-checks to run before installation
///
/// The display name of the pre-check
/// If installation should stop on failing this pre-check
public PreCheckBase(string name, bool required)
{
Name = name;
IsRequired = required;
Id = Guid.NewGuid().ToString();
}
private StatusSpinner.SpinnerState ProcessResult(PreCheckResult result) =>
(result.Succeeded, IsRequired) switch
{
(true, _) => StatusSpinner.SpinnerState.OK,
(false, false) => StatusSpinner.SpinnerState.Warning,
(_, _) => StatusSpinner.SpinnerState.Error
};
///
/// Request pre-checks to be re-evaluated
///
public void RequestReevaluation()
{
ReeevaluationRequested?.Invoke(this, null);
}
public async Task RunCheck()
{
State = StatusSpinner.SpinnerState.Running;
var result = await CheckOperation();
PreCheckDetails = !string.IsNullOrWhiteSpace(result.Message)
? result.Message
: (result.Succeeded
? "Pre-Check succeeded, but no details were provided"
: "Pre-Check failed, but no details were provided");
ActionButtonText = result.ActionButtonText;
ActionButtonCommand = result.ButtonPressedCommand;
ActionButtonIsVisible = result.ActionButtonIsVisible;
State = ProcessResult(result);
return State == StatusSpinner.SpinnerState.OK
? Result.FromSuccess()
: Result.FromError($"PreCheck Failed: {Name}");
}
public abstract Task CheckOperation();
}