# Copyright 2021 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 for creating install scripts from pkg_filegroups and friends.

This module provides an interface (`pkg_install`) for creating a `bazel
run`-able installation script.
"""

load("@bazel_skylib//rules:common_settings.bzl", "BuildSettingInfo")
load("@rules_python//python:defs.bzl", "py_binary")
load("//pkg:providers.bzl", "PackageDirsInfo", "PackageFilegroupInfo", "PackageFilesInfo", "PackageSymlinkInfo")
load("//pkg/private:pkg_files.bzl", "create_mapping_context_from_ctx", "process_src", "write_manifest")

def _pkg_install_script_impl(ctx):
    script_file = ctx.actions.declare_file(ctx.attr.name + ".py")

    mapping_context = create_mapping_context_from_ctx(ctx, label = ctx.label, default_mode = "0644")
    for src in ctx.attr.srcs:
        process_src(
            mapping_context,
            src = src,
            origin = src.label,
        )

    manifest_file = ctx.actions.declare_file(ctx.attr.name + "-install-manifest.json")

    destdir = ctx.attr.destdir
    if ctx.attr.destdir_flag:
        if BuildSettingInfo in ctx.attr.destdir_flag:
            destdir = ctx.attr.destdir_flag[BuildSettingInfo].value

    # Write out the manifest in terms of "short" paths, which are those expected
    # when you make `bazel run`nable binaries).
    #
    # Note that these paths are different when used as tools run within a build.
    # See also
    # https://docs.bazel.build/versions/4.1.0/skylark/rules.html#tools-with-runfiles
    write_manifest(ctx, manifest_file, mapping_context.content_map, use_short_path = True)

    # Get the label of the actual py_binary used to run this script.
    #
    # This is super brittle, but I don't know how to otherwise get this
    # information without creating a circular dependency given the current state
    # of rules_python.

    # The name of the binary is the name of this target, minus
    # "_install_script".
    label_str = str(ctx.label)[:-len("_install_script")]

    ctx.actions.expand_template(
        template = ctx.file._script_template,
        output = script_file,
        substitutions = {
            "{MANIFEST_INCLUSION}": manifest_file.short_path,
            # This is used to extend the manifest paths when the script is run
            # inside a build.
            "{WORKSPACE_NAME}": ctx.workspace_name,
            # Used to annotate --help with "bazel run //path/to/your:installer"
            "{TARGET_LABEL}": label_str,
            "{DEFAULT_DESTDIR}": destdir,
        },
        is_executable = True,
    )

    my_runfiles = ctx.runfiles(
        files = [manifest_file],
        transitive_files = depset(
            direct = mapping_context.file_deps_direct,
            transitive = mapping_context.file_deps_transitive,
        ),
    )

    return [
        DefaultInfo(
            files = depset([script_file]),
            runfiles = my_runfiles,
            executable = script_file,
        ),
    ]

_pkg_install_script = rule(
    doc = """Create an executable package installation script.

    The outputs of this rule are a single python script intended to be used as
    an input to a `py_binary` target.  All files necessary to run the script are
    included as runfiles.
    """,
    implementation = _pkg_install_script_impl,
    attrs = {
        "srcs": attr.label_list(
            mandatory = True,
            providers = [
                [PackageFilegroupInfo],
                [PackageFilesInfo],
                [PackageDirsInfo],
                [PackageSymlinkInfo],
            ],
            doc = "Source mapping/grouping targets",
        ),
        "destdir": attr.string(),
        "destdir_flag": attr.label(doc = "string flag to obtain destdir from"),
        # This is private for now -- one could perhaps imagine making this
        # public, but that would require more documentation of the underlying
        # scripts and expected interfaces.
        "_script_template": attr.label(
            allow_single_file = True,
            default = "//pkg/private:install.py.tpl",
        ),
    },
    executable = True,
)

def pkg_install(name, srcs, destdir = None, destdir_flag = None, **kwargs):
    """Create an installer script from pkg_filegroups and friends.

    This macro allows users to create `bazel run`nable installation scripts
    using the pkg_filegroup framework.

    For example:

    ```python
    pkg_install(
        name = "install",
        srcs = [
            # mapping/grouping targets here
        ],
        destdir = "out/install",
    )
    ```

    Installation can be done by invoking:

    ```
    bazel run -- //path/to:install
    ```

    Additional features can be accessed by invoking the script with the --help
    option:

    ```
    bazel run -- //path/to:install --help
    ```

    WARNING: While this rule does function when being run from within a bazel
    rule, such use is not recommended.  If you do, **always** use the
    `--destdir` argument to specify the desired location for the installation to
    occur.  Not doing so can lead the outputs going to an unexpected location,
    or in some cases, failing.  Run the script command with `--help`, as
    mentioned above, for more details.

    One such use would be to run the script created by `pkg_install` to produce
    a directory output in the build root.  This may not function as expected or
    may suffer from poorly tested edge cases.  A purpose-written rule that would
    allow for creation of such directories is discussed in
    https://github.com/bazelbuild/rules_pkg/issues/388.

    Args:
        name: rule name
        srcs: pkg_filegroup framework mapping or grouping targets
        destdir: The default destination directory.

            If it is specified, this is the default destination to install
            the files. It is overridable by explicitly specifying `--destdir`
            in the command line or specifying the `DESTDIR` environment
            variable.

            If it is not specified, `--destdir` must be set on the command line,
            or the `DESTDIR` environment variable must be set.

            If this is an absolute path, it is used as-is. If this is a relative
            path, it is interpreted against `BUILD_WORKSPACE_DIRECTORY`.
        destdir_flag: A string_flag target used to obtain the value of destdir.
        **kwargs: common rule attributes

    """
    if destdir and destdir_flag:
        fail("You may only set on of destdir or destdir_flag")

    _pkg_install_script(
        name = name + "_install_script",
        srcs = srcs,
        destdir = destdir,
        destdir_flag = destdir_flag,
        **kwargs
    )

    py_binary(
        name = name,
        srcs = [":" + name + "_install_script"],
        main = name + "_install_script.py",
        deps = [Label("//pkg/private:manifest"), Label("@rules_python//python/runfiles")],
        srcs_version = "PY3",
        python_version = "PY3",
        **kwargs
    )
