"multitool module extension"

load("//multitool/private:multitool.bzl", _hub = "bzlmod_hub")

_DEFAULT_HUB_NAME = "multitool"

hub = tag_class(
    attrs = {
        "hub_name": attr.string(default = _DEFAULT_HUB_NAME),
        "lockfile": attr.label(mandatory = True, allow_single_file = True),
    },
)

def _extension(module_ctx):
    lockfiles = {
        _DEFAULT_HUB_NAME: [],
    }

    root_module_direct_deps = {}
    root_module_direct_dev_deps = {}

    for mod in reversed(module_ctx.modules):
        for h in mod.tags.hub:
            if h.hub_name in lockfiles:
                lockfiles[h.hub_name].append(h.lockfile)
            else:
                lockfiles[h.hub_name] = [h.lockfile]

            if not module_ctx.is_dev_dependency(h):
                root_module_direct_deps[h.hub_name] = 1
            else:
                root_module_direct_dev_deps[h.hub_name] = 1

    # ensure _DEFAULT_HUB_NAME is present in non-dev and dev deps
    # when non-dev and dev deps are non-empty.
    if len(root_module_direct_deps) > 0:
        root_module_direct_deps[_DEFAULT_HUB_NAME] = 1
    if len(root_module_direct_dev_deps) > 0:
        root_module_direct_dev_deps[_DEFAULT_HUB_NAME] = 1

    for lockfile_name, lockfile_list in lockfiles.items():
        _hub(
            name = lockfile_name,
            lockfiles = lockfile_list,
            module_ctx = module_ctx,
        )

    return module_ctx.extension_metadata(
        root_module_direct_deps = root_module_direct_deps.keys(),
        root_module_direct_dev_deps = root_module_direct_dev_deps.keys(),
        reproducible = True,  # repo state is only a function of the lockfile
    )

multitool = module_extension(
    implementation = _extension,
    tag_classes = {
        "hub": hub,
    },
)
