using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using SewerStammGen.Shared.Contracts;
using StammGenerator.Interface;
using StammGenerator.ViewModel;
using StammGenerator.ViewModel.Factories;

namespace StammGenerator.HostBuilders
{
    static class AddViewModelsHostBuilderExtensions
    {
        public static IHostBuilder AddViewModels(this IHostBuilder hostBuilder)
        {
            hostBuilder.ConfigureServices(services =>
            {
                
                services.AddTransient<MainWindowViewModel>();

                services.AddSingleton<ViewModelDelegateRenavigator<ProjektListViewModel>>();
                services.AddSingleton<ViewModelDelegateRenavigator<ProjektEditViewModel>>();

                services.AddSingleton<ViewModelDelegateRenavigator<ManholeListViewModel>>();
                services.AddSingleton<ViewModelDelegateRenavigator<ManholeEditViewModel>>();
                services.AddSingleton<ViewModelDelegateRenavigator<ManholeImportViewModel>>();

                services.AddSingleton<ViewModelDelegateRenavigator<HaltungListViewModel>>();
                services.AddSingleton<ViewModelDelegateRenavigator<HaltungEditViewModel>>();

                services.AddSingleton<CreateViewModel<HomeViewModel>>(services =>
                {
                    return () => new HomeViewModel();
                });

                #region Schächte
                services.AddSingleton<CreateViewModel<ManholeListViewModel>>(services =>
                {
                    return () => new ManholeListViewModel(
                        services.GetRequiredService<ISchachtDataService>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ManholeEditViewModel>>(),
                        services.GetRequiredService<IActualState>()
                        );
                });

                services.AddSingleton<CreateViewModel<ManholeEditViewModel>>(services =>
                {
                    return () => new ManholeEditViewModel(
                        services.GetRequiredService<ISchachtDataService>(),
                        services.GetRequiredService<IActualState>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ManholeListViewModel>>()
                        );
                });

                services.AddSingleton<CreateViewModel<ManholeImportViewModel>>(services =>
                {
                    return () => new ManholeImportViewModel(
                        services.GetRequiredService<ISchachtDataService>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ManholeListViewModel>>(),
                        services.GetRequiredService<IActualState>()
                        );
                });
                #endregion

                #region Auftraggeber
                services.AddSingleton<CreateViewModel<AuftraggeberListViewModel>>(services =>
                {
                    return () => new AuftraggeberListViewModel(
                        services.GetRequiredService<IAuftraggeberDataService>()
                        );
                });
                #endregion

                #region Haltungen
                services.AddSingleton<CreateViewModel<HaltungListViewModel>>(services =>
                {
                    return () => new HaltungListViewModel(
                        services.GetRequiredService<IHaltungDataService>(),
                        services.GetRequiredService<IActualState>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<HaltungEditViewModel>>()
                        );
                });

                services.AddTransient<CreateViewModel<HaltungEditViewModel>>(services =>
                {
                    return () => new HaltungEditViewModel(
                        services.GetRequiredService<IHaltungDataService>(),
                        services.GetRequiredService<IActualState>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<HaltungListViewModel>>(),
                        services.GetRequiredService<ISchachtDataService>()
                        );
                });
                #endregion

                #region Projekte
                services.AddSingleton<CreateViewModel<ProjektEditViewModel>>(services =>
                {
                    return () => new ProjektEditViewModel(
                        services.GetRequiredService<IProjektDataService>(),
                        services.GetRequiredService<IAuftraggeberDataService>(),
                        services.GetRequiredService<IActualState>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ProjektListViewModel>>()
                        
                        );
                });

                services.AddSingleton<CreateViewModel<ProjektListViewModel>>(services =>
                {
                    return () => new ProjektListViewModel(
                        services.GetRequiredService<IProjektDataService>(),
                        services.GetRequiredService<IHaltungDataService>(),
                        services.GetRequiredService<ISchachtDataService>(),
                        services.GetRequiredService<IActualState>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ProjektEditViewModel>>(),
                        services.GetRequiredService<ViewModelDelegateRenavigator<ManholeImportViewModel>>()
                        );
                });
                #endregion

                services.AddSingleton<IViewModelAbstractFactory, MainWindowViewModelFactory>();
            });

            return hostBuilder;
        }
    }
}
