#  Copyright 2020 The Monogon Project Authors.
#
#  SPDX-License-Identifier: Apache-2.0
#
#  Licensed under the Apache License, Version 2.0 (the "License");
#  you may not use this file except in compliance with the License.
#  You may obtain a copy of the License at
#
#      http://www.apache.org/licenses/LICENSE-2.0
#
#  Unless required by applicable law or agreed to in writing, software
#  distributed under the License is distributed on an "AS IS" BASIS,
#  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
#  See the License for the specific language governing permissions and
#  limitations under the License.

load("//metropolis/node/build:def.bzl", "build_static_transition")

def _static_binary_tarball_impl(ctx):
    layer_spec = ctx.actions.declare_file(ctx.label.name + ".prototxt")
    if len(ctx.attr.executable) != 1:
        fail("executable arg can only contain one file/label")
    executable_label = ctx.attr.executable[0]
    executable = executable_label[DefaultInfo].files_to_run.executable
    runfiles = executable_label[DefaultInfo].default_runfiles
    files = []
    for file in runfiles.files.to_list():
        layer_path = file.short_path

        # Weird shenanigans with external repos
        if layer_path.startswith("../"):
            layer_path = "external/" + layer_path[3:]
        files.append(struct(
            path = layer_path,
            src = file.path,
        ))
    ctx.actions.write(layer_spec, proto.encode_text(struct(file = files)))

    layer_out = ctx.actions.declare_file(ctx.label.name + ".tar")
    ctx.actions.run(
        outputs = [layer_out],
        inputs = [layer_spec, executable] + runfiles.files.to_list(),
        tools = [ctx.executable._container_binary],
        executable = ctx.executable._container_binary,
        arguments = ["-out", layer_out.path, "-spec", layer_spec.path],
    )

    return [DefaultInfo(files = depset([layer_out]), runfiles = ctx.runfiles(files = [layer_out]))]

static_binary_tarball = rule(
    implementation = _static_binary_tarball_impl,
    doc = """
        Build a tarball from a binary given in `executable` and its runfiles. Everything will be put under
        /app with the same filesystem layout as if run under `bazel run`. So if your executable works under bazel run,
        it will work when packaged with this rule with the exception of runfile manifests, which this rule currently
        doesn't support.
    """,
    attrs = {
        "executable": attr.label(
            mandatory = True,
            executable = True,
            allow_single_file = True,
            cfg = build_static_transition,
        ),
        "_container_binary": attr.label(
            default = Label("//build/static_binary_tarball"),
            cfg = "exec",
            executable = True,
            allow_files = True,
        ),

        # Allow for transitions to be attached to this rule.
        "_whitelist_function_transition": attr.label(
            default = "@bazel_tools//tools/whitelists/function_transition_whitelist",
        ),
    },
)
