using Microsoft.EntityFrameworkCore;
using System.Linq;

namespace Mirea.Api.DataAccess.Persistence.Common;

public static class ModelBuilderExtensions
{
    public static void ApplyConfiguration(this ModelBuilder modelBuilder, object configuration)
    {
        var applyGenericMethod = typeof(ModelBuilder)
            .GetMethods()
            .First(m => m.Name == nameof(ApplyConfiguration) &&
                        m.GetParameters().Any(p => p.ParameterType.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>)));

        var entityType = configuration.GetType().GetInterfaces()
            .First(i => i.IsGenericType && i.GetGenericTypeDefinition() == typeof(IEntityTypeConfiguration<>))
            .GetGenericArguments()[0];

        var applyConcreteMethod = applyGenericMethod.MakeGenericMethod(entityType);
        applyConcreteMethod.Invoke(modelBuilder, [configuration]);
    }
}