using System.Reflection;
using System.Runtime.Loader;

namespace Ellie.Marmalade;

public class MarmaladeAssemblyLoadContext : AssemblyLoadContext
{
    private readonly AssemblyDependencyResolver _resolver;
    
    public MarmaladeAssemblyLoadContext(string folderPath) : base(isCollectible: true)
        => _resolver = new(folderPath);

    // public Assembly MainAssembly { get; private set; }

    protected override Assembly? Load(AssemblyName assemblyName)
    {
        var assemblyPath = _resolver.ResolveAssemblyToPath(assemblyName);
        if (assemblyPath != null)
        {
            var assembly = LoadFromAssemblyPath(assemblyPath);
            LoadDependencies(assembly);
            return assembly;
        }

        return null;
    }

    public void LoadDependencies(Assembly assembly)
    {
        foreach (var reference in assembly.GetReferencedAssemblies())
        {
            Load(reference);
        }
    }
}