using System;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Pole.Core;
using Pole.Core.EventBus;

namespace Pole.EventBus.RabbitMQ
{
    public static class Extensions
    {
        public static void AddRabbitMQ(
            this IServiceCollection serviceCollection,
            Action<RabbitOptions> rabbitConfigAction,
            Func<IRabbitEventBusContainer, Task> eventBusConfig = default)
        {
            serviceCollection.Configure<RabbitOptions>(config => rabbitConfigAction(config));
            serviceCollection.AddSingleton<IRabbitMQClient, RabbitMQClient>();
            serviceCollection.AddHostedService<ConsumerManager>();
            serviceCollection.AddSingleton<IRabbitEventBusContainer, EventBusContainer>();
            serviceCollection.AddSingleton(serviceProvider => serviceProvider.GetService<IRabbitEventBusContainer>() as IProducerContainer);
            Startup.Register(async serviceProvider =>
            {
                var container = serviceProvider.GetService<IRabbitEventBusContainer>();
                if (eventBusConfig != default)
                    await eventBusConfig(container);
                else
                    await container.AutoRegister();
            });
        }
    }
}