using System.Reflection;
using Femto.Common.Attributes;
using MediatR;

namespace Femto.Common.Util;

public static class EventTypeMapping
{
    public static IDictionary<string, Type> GetEventTypeMapping(Assembly assembly)
    {
        var mapping = new Dictionary<string, Type>();

        var types = assembly.GetTypes();

        foreach (var type in types)
        {
            if (
                !typeof(INotification).IsAssignableFrom(type)
                || type.IsAbstract
                || type.IsInterface
            )
                continue;

            var attribute = type.GetCustomAttribute<EventTypeAttribute>();
            if (attribute == null)
                continue;

            var eventName = attribute.Name;
            if (!string.IsNullOrWhiteSpace(eventName))
            {
                mapping.TryAdd(eventName, type);
            }
        }

        return mapping;
    }
}
