using AvParser.Core.Collecting;
using AvParser.Core.Proxies;
using AvParser.Core.Settings;
using AvParser.Infrastructure.Proxies;
using AvParser.Infrastructure.Storage;
using AvParser.UI.Media;
using AvParser.UI.Navigation;
using AvParser.UI.Services;
using AvParser.UI.ViewModels;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using Serilog.Core;
namespace AvParser.UI.DependencyInjection;
/// Composition root for the presentation layer.
public static class UiServiceCollectionExtensions
{
/// Registers the view locator, shell services and every page.
///
/// Pages are registered twice on purpose: once under their concrete type (so tests and other
/// pages can ask for one specifically) and once under in the order
/// they should appear in the navigation rail.
///
public static IServiceCollection AddAvParserUI(this IServiceCollection services)
{
ArgumentNullException.ThrowIfNull(services);
services.AddSingleton();
services.AddSingleton(static sp => new ThumbnailCache(
sp.GetRequiredService(),
sp.GetRequiredService>()
));
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
services.AddSingleton(static sp => new DashboardViewModel(
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp
));
services.AddSingleton(static sp => new SettingsViewModel(
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService()
));
services.AddSingleton(static sp => new CollectViewModel(
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp,
sp.GetRequiredService>()
));
services.AddSingleton(static sp => new GalleryViewModel(
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService>()
));
services.AddSingleton(static sp => new ProxiesViewModel(
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService(),
sp.GetRequiredService>()
));
services.AddSingleton();
// Order here is the order of the navigation rail; the first entry is the landing page.
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => sp.GetRequiredService());
services.AddSingleton(static sp => new ShellViewModel(
sp.GetRequiredService(),
sp.GetRequiredService()
));
return services;
}
}