"""
Generates package naming variables for use with rules_pkg.
"""

load("@bazel_tools//tools/cpp:toolchain_utils.bzl", "find_cpp_toolchain")
load("@rules_pkg//pkg:providers.bzl", "PackageVariablesInfo")
load(":protobuf_version.bzl", "PROTOC_VERSION")

def _package_naming_impl(ctx):
    values = {}
    values["version"] = PROTOC_VERSION

    # infer from the current cpp toolchain.
    toolchain = find_cpp_toolchain(ctx)
    cpu = toolchain.cpu
    system_name = toolchain.target_gnu_system_name

    # rename cpus to match what we want artifacts to be
    if cpu == "systemz":
        cpu = "s390_64"
    elif cpu == "aarch64":
        cpu = "aarch_64"
    elif cpu == "ppc64":
        cpu = "ppcle_64"

    # use the system name to determine the os and then create platform names
    if "apple" in system_name:
        values["platform"] = "osx-" + cpu
    elif "linux" in system_name:
        values["platform"] = "linux-" + cpu
    elif "mingw" in system_name:
        if cpu == "x86_64":
            values["platform"] = "win64"
        else:
            values["platform"] = "win32"
    else:
        values["platform"] = "unknown"

    return PackageVariablesInfo(values = values)

package_naming = rule(
    implementation = _package_naming_impl,
    attrs = {
        # Necessary data dependency for find_cpp_toolchain.
        "_cc_toolchain": attr.label(default = Label("@bazel_tools//tools/cpp:current_cc_toolchain")),
    },
    toolchains = ["@bazel_tools//tools/cpp:toolchain_type"],
)
