"""
This module exports the pkg_cross_compiled_binaries rule. This rule is used to create a pkg_filegroup
that contains the cross compiled binaries for each cpu.
"""

load("@rules_pkg//pkg:mappings.bzl", "pkg_attributes", "pkg_filegroup", "pkg_files")

def _cpu_transition_impl(settings, attr):
    _ignore = (settings)  # @unused
    return [{"//command_line_option:cpu": attr.cpu}]

_cpu_transition = transition(
    implementation = _cpu_transition_impl,
    inputs = [],
    outputs = [
        "//command_line_option:cpu",
    ],
)

def _cross_compiled_binary_impl(ctx):
    target = ctx.attr.target

    default_info = target[0][DefaultInfo]
    files = default_info.files
    runfiles = default_info.default_runfiles

    files = depset(transitive = [files])

    return [
        DefaultInfo(
            files = files,
            runfiles = runfiles,
        ),
    ]

_cross_compiled_binary = rule(
    implementation = _cross_compiled_binary_impl,
    attrs = {
        "target": attr.label(
            mandatory = True,
            cfg = _cpu_transition,
        ),
        "cpu": attr.string(),
        "_allowlist_function_transition": attr.label(
            default = "@bazel_tools//tools/allowlists/function_transition_allowlist",
        ),
    },
)

def pkg_cross_compiled_binaries(name, cpus, targets, prefix, tags):
    """Creates a pkg_filegroup that contains the cross compiled binaries for each cpu.

    This rule is used to create a pkg_filegroup that contains the cross compiled binaries for each
    cpu. The binaries are created by an aspect that changes the cpu configuration for each target.
    The targets are placed into a directory that is named after the cpu.

    Args:
      name: The name of the pkg_filegroup.
      cpus: The cpus to cross compile for.
      targets: The targets to cross compile.
      prefix: The prefix to add to the pkg_filegroup.
      tags: The tags to add to the pkg_filegroup.
    """

    filegroups = []
    for cpu in cpus:
        compiled_targets = []
        for target in targets:
            target_name = target.split(":")[1]
            bin_target_name = name + "_" + cpu + "_" + target_name
            _cross_compiled_binary(
                name = bin_target_name,
                cpu = cpu,
                target = target,
            )
            compiled_targets.append(Label(":" + bin_target_name))
        files_name = name + "_" + cpu + "_src"
        filegroup_name = files_name + "_dir"
        filegroups.append(Label(":" + filegroup_name))
        pkg_files(
            name = files_name,
            srcs = compiled_targets,
            attributes = pkg_attributes(
                mode = "0755",
            ),
        )
        pkg_filegroup(
            name = filegroup_name,
            srcs = [Label(":" + files_name)],
            prefix = cpu,
        )
    pkg_filegroup(
        name = name,
        srcs = filegroups,
        prefix = prefix,
        tags = tags,
    )
    return
