using Microsoft.EntityFrameworkCore;
using System;

namespace Mirea.Api.DataAccess.Persistence.Common;

public static class DbContextFactory
{
    public static DbContextOptionsBuilder CreateDbContext<TDbContext, TEntity>(this DbContextOptionsBuilder options, DatabaseProvider provider)
        where TDbContext : BaseDbContext<TDbContext>
        where TEntity : class
    {
        var dbContext = (TDbContext)Activator.CreateInstance(typeof(TDbContext), (DbContextOptions<TDbContext>)options.Options)!;
        var configurationType = ConfigurationResolver.GetConfigurationType<TEntity>(provider);
        var configurationInstance = (IEntityTypeConfiguration<TEntity>)Activator.CreateInstance(configurationType)!;

        var modelBuilder = new ModelBuilder();
        modelBuilder.ApplyConfiguration(configurationInstance);
        dbContext.ApplyConfigurations(modelBuilder);

        return options;
    }
}