using BMA.EHR.Application.Common.Interfaces;
using BMA.EHR.Application.Repositories;
using BMA.EHR.Infrastructure.MessageQueue;
using BMA.EHR.Infrastructure.Persistence;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;

namespace BMA.EHR.Infrastructure
{
    public static class InfrastructureServiceRegistration
    {
        public static IServiceCollection AddMessageQueue(this IServiceCollection services)
        {
            services.AddHostedService<RabbitMQConsumer>();

            return services;
        }

        public static IServiceCollection AddLeavePersistence(this IServiceCollection services,
            IConfiguration configuration)
        {


            // leave db context
            var connectionStringLeave = configuration.GetConnectionString("LeaveConnection");

            services.AddDbContext<LeaveDbContext>(options =>
                options.UseMySql(connectionStringLeave, ServerVersion.AutoDetect(connectionStringLeave),
                b =>
                {
                    b.MigrationsAssembly(typeof(LeaveDbContext).Assembly.FullName);
                    b.MigrationsHistoryTable("__LeaveMigrationsHistory");

                }),
                ServiceLifetime.Transient);

            services.AddTransient<ILeaveDbContext>(provider => provider.GetService<LeaveDbContext>());

            return services;
        }

        public static IServiceCollection AddDisciplinePersistence(this IServiceCollection services,
            IConfiguration configuration)
        {


            // discipline db context
            var connectionStringDiscipline = configuration.GetConnectionString("DisciplineConnection");

            services.AddDbContext<DisciplineDbContext>(options =>
                options.UseMySql(connectionStringDiscipline, ServerVersion.AutoDetect(connectionStringDiscipline),
                b =>
                {
                    b.MigrationsAssembly(typeof(DisciplineDbContext).Assembly.FullName);
                    b.MigrationsHistoryTable("__DisciplineMigrationsHistory");

                }),
                ServiceLifetime.Transient);

            services.AddTransient<IDisciplineDbContext>(provider => provider.GetService<DisciplineDbContext>());

            return services;
        }

        public static IServiceCollection AddPersistence(this IServiceCollection services,
            IConfiguration configuration)
        {
            services.AddTransient<MinIOService>();


            var connectionString = configuration.GetConnectionString("DefaultConnection");

            services.AddDbContext<ApplicationDBContext>(options =>
                options.UseMySql(connectionString, ServerVersion.AutoDetect(connectionString),
                b =>
                {
                    b.MigrationsAssembly(typeof(ApplicationDBContext).Assembly.FullName);
                    b.MigrationsHistoryTable("__EHRMigrationsHistory");

                }),
                ServiceLifetime.Transient);

            services.AddTransient<IApplicationDBContext>(provider => provider.GetService<ApplicationDBContext>());

            var connectionStringExam = configuration.GetConnectionString("ExamConnection");

            services.AddDbContext<ApplicationDBExamContext>(options =>
                options.UseMySql(connectionStringExam, ServerVersion.AutoDetect(connectionStringExam),
                b =>
                {
                    b.MigrationsAssembly(typeof(ApplicationDBExamContext).Assembly.FullName);
                    b.MigrationsHistoryTable("__EHRMigrationsHistory");

                }),
                ServiceLifetime.Transient);

            services.AddTransient<IApplicationDBExamContext>(provider => provider.GetService<ApplicationDBExamContext>());


            return services;
        }

    }
}
