using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using CommunityToolkit.Diagnostics;
using StrixMusic.Sdk.CoreModels;
using Windows.Storage;
namespace StrixMusic.Services.CoreManagement
{
///
/// Manages added and removing core instances.
///
public sealed class CoreManagementService : ICoreManagementService
{
private readonly AppSettings _settings;
///
/// Creates a new instance of .
///
/// Settings service used to store core information.
public CoreManagementService(AppSettings settings)
{
_settings = settings;
}
///
public async Task RegisterCoreInstanceAsync(CoreMetadata coreMetadata)
{
Guard.IsTrue(IsInitialized, nameof(IsInitialized));
Guard.HasSizeGreaterThan(CoreRegistry.MetadataRegistry, 0, nameof(CoreRegistry.MetadataRegistry));
foreach (var metadata in CoreRegistry.MetadataRegistry)
{
if (metadata.Id != coreMetadata.Id)
continue;
var guid = Guid.NewGuid();
var instanceId = $"{metadata.Id}.{guid}";
_settings.CoreInstanceRegistry.Add(instanceId, metadata);
_settings.CoreRanking.Add(instanceId);
await _settings.SaveAsync();
CoreInstanceRegistered?.Invoke(this, new CoreInstanceEventArgs(instanceId, coreMetadata));
return instanceId;
}
return ThrowHelper.ThrowArgumentException($"Could not find core with ID {coreMetadata.Id} in the registry.");
}
///
public async Task UnregisterCoreInstanceAsync(string instanceId)
{
Guard.IsTrue(IsInitialized, nameof(IsInitialized));
Guard.HasSizeGreaterThan(CoreRegistry.MetadataRegistry, 0, nameof(CoreRegistry.MetadataRegistry));
Guard.IsGreaterThan(_settings.CoreInstanceRegistry.Count, 0, nameof(_settings.CoreInstanceRegistry));
Guard.IsGreaterThan(_settings.CoreRanking.Count, 0, nameof(_settings.CoreRanking));
if (_settings.CoreInstanceRegistry.TryGetValue(instanceId, out var value))
{
_settings.CoreInstanceRegistry.Remove(instanceId);
_settings.CoreRanking.Remove(instanceId);
// TODO: Wait to fully dispose of core.
CoreInstanceUnregistered?.Invoke(this, new CoreInstanceEventArgs(instanceId, value));
}
var rootStorageFolder = await ApplicationData.Current.LocalFolder.CreateFolderAsync(instanceId, CreationCollisionOption.OpenIfExists);
await rootStorageFolder.DeleteAsync();
await _settings.SaveAsync();
}
///
public CoreMetadata GetCoreMetadata(ICore core)
{
Guard.IsTrue(IsInitialized, nameof(IsInitialized));
return _settings.CoreInstanceRegistry.First(x => x.Key == core.InstanceId).Value;
}
///
public event EventHandler? CoreInstanceRegistered;
///
public event EventHandler? CoreInstanceUnregistered;
///
public bool IsInitialized { get; private set; }
///
public async Task InitAsync(CancellationToken cancellationToken = default)
{
if (IsInitialized)
return;
IsInitialized = true;
await _settings.LoadAsync(cancellationToken);
}
///
public async Task> GetCoreInstanceRegistryAsync()
{
await _settings.LoadAsync();
return _settings.CoreInstanceRegistry;
}
///
public async Task> GetCoreInstanceRanking()
{
await _settings.LoadAsync();
return _settings.CoreRanking;
}
}
}