// Copyright (c) Arlo Godfrey. All Rights Reserved.
// Licensed under the GNU Lesser General Public License, Version 3.0 with additional terms.
// See the LICENSE, LICENSE.LESSER and LICENSE.ADDITIONAL files in the project root for more information.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading;
using System.Threading.Tasks;
using OwlCore.ComponentModel;
using OwlCore.Events;
using StrixMusic.Sdk.AdapterModels;
using StrixMusic.Sdk.AppModels;
using StrixMusic.Sdk.CoreModels;
using StrixMusic.Sdk.MediaPlayback;
namespace StrixMusic.Sdk.Plugins.Model
{
///
/// An implementation of which delegates all member access to the implementation,
/// unless the member is overridden in a derived class which changes the behavior.
///
public class AlbumCollectionPluginBase : IModelPlugin, IAlbumCollection, IDelegatable
{
///
/// Creates a new instance of .
///
/// Metadata about the plugin which was provided during registration.
/// The implementation which all member access is delegated to, unless the member is overridden in a derived class which changes the behavior.
internal protected AlbumCollectionPluginBase(ModelPluginMetadata registration, IAlbumCollection inner)
{
Metadata = registration;
Inner = inner;
InnerUrlCollection = inner;
InnerImageCollection = inner;
InnerPlayable = inner;
InnerDownloadable = inner;
}
///
/// Metadata about the plugin which was provided during registration.
///
public ModelPluginMetadata Metadata { get; }
///
public IAlbumCollection Inner { get; set; }
///
/// A wrapped implementation which member access can be delegated to. Defaults to .
///
public IPlayable InnerPlayable { get; set; }
///
/// A wrapped implementation which member access can be delegated to. Defaults to .
///
public IDownloadable InnerDownloadable { get; set; }
///
/// A wrapped implementation which member access can be delegated to. Defaults to .
///
public IUrlCollection InnerUrlCollection { get; set; }
///
/// A wrapped implementation which member access can be delegated to. Defaults to .
///
public IImageCollection InnerImageCollection { get; set; }
///
public virtual int TotalAlbumItemsCount => Inner.TotalAlbumItemsCount;
///
public virtual bool IsPlayAlbumCollectionAsyncAvailable => Inner.IsPlayAlbumCollectionAsyncAvailable;
///
public virtual bool IsPauseAlbumCollectionAsyncAvailable => Inner.IsPauseAlbumCollectionAsyncAvailable;
///
public virtual DateTime? AddedAt => Inner.AddedAt;
///
public virtual string Id => InnerPlayable.Id;
///
public virtual string Name => InnerPlayable.Name;
///
public virtual string? Description => InnerPlayable.Description;
///
public virtual DateTime? LastPlayed => InnerPlayable.LastPlayed;
///
public virtual PlaybackState PlaybackState => InnerPlayable.PlaybackState;
///
public virtual TimeSpan Duration => InnerPlayable.Duration;
///
public virtual bool IsChangeNameAsyncAvailable => InnerPlayable.IsChangeNameAsyncAvailable;
///
public virtual bool IsChangeDescriptionAsyncAvailable => InnerPlayable.IsChangeDescriptionAsyncAvailable;
///
public virtual bool IsChangeDurationAsyncAvailable => InnerPlayable.IsChangeDurationAsyncAvailable;
///
public virtual DownloadInfo DownloadInfo => InnerDownloadable.DownloadInfo;
///
public virtual int TotalImageCount => InnerImageCollection.TotalImageCount;
///
public virtual int TotalUrlCount => InnerUrlCollection.TotalUrlCount;
///
IReadOnlyList IMerged.Sources => ((IMerged)Inner).Sources;
///
IReadOnlyList IMerged.Sources => ((IMerged)Inner).Sources;
///
IReadOnlyList IMerged.Sources => ((IMerged)InnerImageCollection).Sources;
///
IReadOnlyList IMerged.Sources => ((IMerged)InnerUrlCollection).Sources;
///
public event EventHandler? SourcesChanged
{
add => Inner.SourcesChanged += value;
remove => Inner.SourcesChanged -= value;
}
///
public virtual event CollectionChangedEventHandler? AlbumItemsChanged
{
add => Inner.AlbumItemsChanged += value;
remove => Inner.AlbumItemsChanged -= value;
}
///
public virtual event EventHandler? AlbumItemsCountChanged
{
add => Inner.AlbumItemsCountChanged += value;
remove => Inner.AlbumItemsCountChanged -= value;
}
///
public virtual event EventHandler? IsPlayAlbumCollectionAsyncAvailableChanged
{
add => Inner.IsPlayAlbumCollectionAsyncAvailableChanged += value;
remove => Inner.IsPlayAlbumCollectionAsyncAvailableChanged -= value;
}
///
public virtual event EventHandler? IsPauseAlbumCollectionAsyncAvailableChanged
{
add => Inner.IsPauseAlbumCollectionAsyncAvailableChanged += value;
remove => Inner.IsPauseAlbumCollectionAsyncAvailableChanged -= value;
}
///
public virtual event EventHandler? PlaybackStateChanged
{
add => InnerPlayable.PlaybackStateChanged += value;
remove => InnerPlayable.PlaybackStateChanged -= value;
}
///
public virtual event EventHandler? NameChanged
{
add => InnerPlayable.NameChanged += value;
remove => InnerPlayable.NameChanged -= value;
}
///
public virtual event EventHandler? DescriptionChanged
{
add => InnerPlayable.DescriptionChanged += value;
remove => InnerPlayable.DescriptionChanged -= value;
}
///
public virtual event EventHandler? DurationChanged
{
add => InnerPlayable.DurationChanged += value;
remove => InnerPlayable.DurationChanged -= value;
}
///
public virtual event EventHandler? LastPlayedChanged
{
add => InnerPlayable.LastPlayedChanged += value;
remove => InnerPlayable.LastPlayedChanged -= value;
}
///
public virtual event EventHandler? IsChangeNameAsyncAvailableChanged
{
add => InnerPlayable.IsChangeNameAsyncAvailableChanged += value;
remove => InnerPlayable.IsChangeNameAsyncAvailableChanged -= value;
}
///
public virtual event EventHandler? IsChangeDescriptionAsyncAvailableChanged
{
add => InnerPlayable.IsChangeDescriptionAsyncAvailableChanged += value;
remove => InnerPlayable.IsChangeDescriptionAsyncAvailableChanged -= value;
}
///
public virtual event EventHandler? IsChangeDurationAsyncAvailableChanged
{
add => InnerPlayable.IsChangeDurationAsyncAvailableChanged += value;
remove => InnerPlayable.IsChangeDurationAsyncAvailableChanged -= value;
}
///
public virtual event EventHandler? DownloadInfoChanged
{
add => InnerDownloadable.DownloadInfoChanged += value;
remove => InnerDownloadable.DownloadInfoChanged -= value;
}
///
public virtual event CollectionChangedEventHandler? ImagesChanged
{
add => InnerImageCollection.ImagesChanged += value;
remove => InnerImageCollection.ImagesChanged -= value;
}
///
public virtual event EventHandler? ImagesCountChanged
{
add => InnerImageCollection.ImagesCountChanged += value;
remove => InnerImageCollection.ImagesCountChanged -= value;
}
///
public virtual event CollectionChangedEventHandler? UrlsChanged
{
add => InnerUrlCollection.UrlsChanged += value;
remove => InnerUrlCollection.UrlsChanged -= value;
}
///
public virtual event EventHandler? UrlsCountChanged
{
add => InnerUrlCollection.UrlsCountChanged += value;
remove => InnerUrlCollection.UrlsCountChanged -= value;
}
///
public virtual Task AddImageAsync(IImage image, int index, CancellationToken cancellationToken = default) => InnerImageCollection.AddImageAsync(image, index, cancellationToken);
///
public virtual Task AddAlbumItemAsync(IAlbumCollectionItem albumItem, int index, CancellationToken cancellationToken = default) => Inner.AddAlbumItemAsync(albumItem, index, cancellationToken);
///
public virtual Task AddUrlAsync(IUrl url, int index, CancellationToken cancellationToken = default) => InnerUrlCollection.AddUrlAsync(url, index, cancellationToken);
///
public virtual Task ChangeDescriptionAsync(string? description, CancellationToken cancellationToken = default) => InnerPlayable.ChangeDescriptionAsync(description, cancellationToken);
///
public virtual Task ChangeDurationAsync(TimeSpan duration, CancellationToken cancellationToken = default) => InnerPlayable.ChangeDurationAsync(duration, cancellationToken);
///
public virtual Task ChangeNameAsync(string name, CancellationToken cancellationToken = default) => InnerPlayable.ChangeNameAsync(name, cancellationToken);
///
public virtual bool Equals(ICoreAlbumCollectionItem other) => Inner.Equals(other);
///
public virtual bool Equals(ICoreAlbumCollection other) => Inner.Equals(other);
///
public virtual bool Equals(ICoreImageCollection other) => InnerImageCollection.Equals(other);
///
public virtual bool Equals(ICoreUrlCollection other) => InnerUrlCollection.Equals(other);
///
public virtual IAsyncEnumerable GetImagesAsync(int limit, int offset, CancellationToken cancellationToken = default) => InnerImageCollection.GetImagesAsync(limit, offset, cancellationToken);
///
public virtual IAsyncEnumerable GetAlbumItemsAsync(int limit, int offset, CancellationToken cancellationToken = default) => Inner.GetAlbumItemsAsync(limit, offset, cancellationToken);
///
public virtual IAsyncEnumerable GetUrlsAsync(int limit, int offset, CancellationToken cancellationToken = default) => InnerUrlCollection.GetUrlsAsync(limit, offset, cancellationToken);
///
public virtual Task IsAddImageAvailableAsync(int index, CancellationToken cancellationToken = default) => InnerImageCollection.IsAddImageAvailableAsync(index, cancellationToken);
///
public virtual Task IsAddAlbumItemAvailableAsync(int index, CancellationToken cancellationToken = default) => Inner.IsAddAlbumItemAvailableAsync(index, cancellationToken);
///
public virtual Task IsAddUrlAvailableAsync(int index, CancellationToken cancellationToken = default) => InnerUrlCollection.IsAddUrlAvailableAsync(index, cancellationToken);
///
public virtual Task IsRemoveImageAvailableAsync(int index, CancellationToken cancellationToken = default) => InnerImageCollection.IsRemoveImageAvailableAsync(index, cancellationToken);
///
public virtual Task IsRemoveAlbumItemAvailableAsync(int index, CancellationToken cancellationToken = default) => Inner.IsRemoveAlbumItemAvailableAsync(index, cancellationToken);
///
public virtual Task IsRemoveUrlAvailableAsync(int index, CancellationToken cancellationToken = default) => InnerUrlCollection.IsRemoveUrlAvailableAsync(index, cancellationToken);
///
public virtual Task PauseAlbumCollectionAsync(CancellationToken cancellationToken = default) => Inner.PauseAlbumCollectionAsync(cancellationToken);
///
public virtual Task PlayAlbumCollectionAsync(IAlbumCollectionItem albumItem, CancellationToken cancellationToken = default) => Inner.PlayAlbumCollectionAsync(albumItem, cancellationToken);
///
public virtual Task PlayAlbumCollectionAsync(CancellationToken cancellationToken = default) => Inner.PlayAlbumCollectionAsync(cancellationToken);
///
public virtual Task RemoveImageAsync(int index, CancellationToken cancellationToken = default) => InnerImageCollection.RemoveImageAsync(index, cancellationToken);
///
public virtual Task RemoveAlbumItemAsync(int index, CancellationToken cancellationToken = default) => Inner.RemoveAlbumItemAsync(index, cancellationToken);
///
public virtual Task RemoveUrlAsync(int index, CancellationToken cancellationToken = default) => InnerUrlCollection.RemoveUrlAsync(index, cancellationToken);
///
public virtual Task StartDownloadOperationAsync(DownloadOperation operation, CancellationToken cancellationToken = default) => InnerDownloadable.StartDownloadOperationAsync(operation, cancellationToken);
///
public virtual ValueTask DisposeAsync()
{
var uniqueInstances = new HashSet()
{
Inner,
InnerDownloadable,
InnerPlayable,
InnerImageCollection,
InnerUrlCollection,
};
return new ValueTask(uniqueInstances.AsParallel()
.Select(x => x.DisposeAsync().AsTask())
.Aggregate((x, y) => Task.WhenAll(x, y)));
}
}
}