using System.IO;
using System.Threading.Tasks;
using CommandLineWrapper;
using CommandLineWrapper.JsonResults.Implements;
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
namespace JVDesktop.ViewModels;
public partial class DashboardViewModel : ViewModel
{
// Getters
private StatusResultGetter? _statusResultGetter;
private InfoResultGetter? _infoResultGetter;
private AccountListResultGetter? _accountListResultGetter;
private HereResultGetter? _hereResultGetter;
private ShareListResultGetter? _shareListResultGetter;
private ShareSeeResultGetter? _shareSeeResultGetter;
private SheetAlignTasksResultGetter? _sheetAlignTasksResultGetter;
private SheetListResultGetter? _sheetListResultGetter;
///
/// Workspace object
///
[ObservableProperty]
private JVCSWorkspace? _workspace;
///
/// If the workspace object exists, it proves the workspace is initialized
///
public bool WorkspaceInitialized => Workspace != null;
///
/// Current workspace directory
///
[ObservableProperty]
private string _currentWorkspaceDirectory = "";
///
/// Currently used account
///
[ObservableProperty]
private string _currentAccount = "unknown";
///
/// Whether HOST mode is currently enabled
///
[ObservableProperty]
private bool? _hostMode;
///
/// Currently used structure sheet (empty means no sheet is used)
///
[ObservableProperty]
private string? _currentSheet;
///
/// Upstream of the current workspace
///
[ObservableProperty]
private string _currentUpstream = "127.0.0.1";
///
/// Result from the last alignment check
///
[ObservableProperty]
private AlignResult? _alignResult;
///
/// Result from the last current directory information collection
///
[ObservableProperty]
private HereResult? _hereResult;
///
/// Result from the last change status collection
///
[ObservableProperty]
private StatusResult? _statusResult;
///
/// Result from the last sheet detection
///
[ObservableProperty]
private SheetListResult? _sheetListResult;
///
/// Result from the last account detection
///
[ObservableProperty]
private AccountListResult? _accountListResult;
///
/// Triggered when the workspace changes
///
partial void OnWorkspaceChanged(JVCSWorkspace? value)
{
// Update workspace initialization status
OnPropertyChanged(nameof(WorkspaceInitialized));
// Clear status
if (value == null)
{
StatusClean();
return;
}
// Initial load
_ = ReloadFromWorkspace(value);
}
///
/// Clear status
///
private void StatusClean()
{
CurrentWorkspaceDirectory = "";
CurrentAccount = "unknown";
HostMode = null;
CurrentSheet = null;
CurrentUpstream = "127.0.0.1";
AlignResult = null;
HereResult = null;
StatusResult = null;
SheetListResult = null;
}
///
/// Load status from the workspace object
///
/// Workspace
private async Task ReloadFromWorkspace(JVCSWorkspace workspace)
{
InitializeGetters(workspace);
var alignTask = _sheetAlignTasksResultGetter?.Get(workspace)!;
var hereTask = _hereResultGetter?.Get(workspace)!;
var statusTask = _statusResultGetter?.Get(workspace)!;
var sheetListTask = _sheetListResultGetter?.Get(workspace)!;
var accountListTask = _accountListResultGetter?.Get(workspace)!;
await Task.WhenAll(alignTask, hereTask, statusTask, sheetListTask, accountListTask);
AlignResult = await alignTask;
HereResult = await hereTask;
StatusResult = await statusTask;
SheetListResult = await sheetListTask;
AccountListResult = await accountListTask;
}
///
/// Initializes all getters if they are null.
///
/// Workspace
private void InitializeGetters(JVCSWorkspace workspace)
{
if (Workspace == null)
return;
var workspaceDirectory = "";
if (Workspace.SuccessInitialized)
workspaceDirectory = Workspace.WorkspaceDirectory;
_statusResultGetter ??= new StatusResultGetter();
_infoResultGetter ??= new InfoResultGetter("");
_accountListResultGetter ??= new AccountListResultGetter();
_hereResultGetter ??= new HereResultGetter(new DirectoryInfo(workspaceDirectory));
_shareListResultGetter ??= new ShareListResultGetter();
_shareSeeResultGetter ??= new ShareSeeResultGetter("");
_sheetAlignTasksResultGetter ??= new SheetAlignTasksResultGetter();
_sheetListResultGetter ??= new SheetListResultGetter();
}
}