# Copyright 2020 The Bazel Authors. All rights reserved.
#
# 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.

"""Rules to create a release archive"""

def release_archive(name, srcs = [], src_map = {}, package_dir = "-", deps = [], **kwargs):
    """ Creates an zip of the srcs, and renamed label artifacts.

    Usage:
    //:BUILD
    load("//src:release_archive.bzl", "release_archive")
    release_archive(
        name = "release_archive",
        src_map = {
            "BUILD.release.bazel.bazel": "BUILD.bazel",
            "WORKSPACE.release.bazel": "WORKSPACE",
        },
        deps = [
            "//dep:pkg"
        ],
    )
    //dep:BUILD
    load("//src:release_archive.bzl", "release_archive")
    release_archive(
        name = "pkg",
        srcs = [
            ":label_of_artifact",
        ],
    )
    Args:
        name: target identifier, points to a pkg_tar target.
        package_dir: directory to place the srcs, src_map, and dist_files under. Defaults to the current directory.
        src_map: dict of <label>:<name string> for labels to be renamed and included in the distribution.
        srcs: files to include in the distribution.
        deps: release_archives to be included.
        **kwargs: other arguments added to the final genrule (for example visibility)
    """
    srcs = list(srcs)
    for source, target in src_map.items():
        rename_name = name + "_" + target
        _rename(
            name = rename_name,
            source = source,
            target = target,
        )
        srcs.append(rename_name)

    if srcs != []:
        native.genrule(
            name = name + "_srcs",
            srcs = srcs,
            outs = [name + "_srcs.zip"],
            cmd = "zip -qjX $@ $$(echo $(SRCS) | sort)",
            visibility = ["//visibility:private"],
        )
        deps = [name + "_srcs.zip"] + deps

    native.genrule(
        name = name,
        srcs = deps,
        outs = [(name[:-len("_zip")] if name.endswith("_zip") else name) + ".zip"],
        cmd = "$(location //src:merge_zip_files) %s $@ $(SRCS)" % package_dir,
        output_to_bindir = 1,
        tools = ["//src:merge_zip_files"],
        **kwargs
    )

def _rename_impl(ctx):
    out_file = ctx.actions.declare_file(ctx.label.name + "/" + ctx.attr.target)
    in_file = ctx.file.source
    ctx.actions.run_shell(
        inputs = [in_file],
        outputs = [out_file],
        progress_message = "%s -> %s" % (in_file, ctx.attr.target),
        command = "mkdir -p {dir} && cp {in_file} {out_file}".format(
            dir = out_file.dirname,
            in_file = in_file.path,
            out_file = out_file.path,
        ),
    )
    return [DefaultInfo(files = depset([out_file]))]

_rename = rule(
    implementation = _rename_impl,
    attrs = {
        "source": attr.label(allow_single_file = True, mandatory = True),
        "target": attr.string(mandatory = True),
    },
)
