using NubLang.Parsing.Syntax;

namespace NubLang.Modules;

public class ModuleRepository
{
    private readonly Dictionary<string, Module> _modules = new();

    public ModuleRepository(List<SyntaxTree> syntaxTrees)
    {
        foreach (var syntaxTree in syntaxTrees)
        {
            var module = GetOrCreate(syntaxTree.Metadata.ModuleName);
            ProcessSyntaxTree(module, syntaxTree);
        }
    }

    private static void ProcessSyntaxTree(Module module, SyntaxTree syntaxTree)
    {
        foreach (var definition in syntaxTree.Definitions)
        {
            module.Register(definition);
        }
    }

    public Dictionary<string, Module> Modules()
    {
        return _modules;
    }

    private Module GetOrCreate(string name)
    {
        if (!_modules.TryGetValue(name, out var module))
        {
            module = new Module();
            _modules[name] = module;
        }

        return module;
    }
}