# Copyright 2022 Google LLC
#
# 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
#
# https://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 declaring metadata about a package."""

load(
    "@rules_license//rules:providers.bzl",
    "ExperimentalMetadataInfo",
    "PackageInfo",
)

#
# package_info()
#

def _package_info_impl(ctx):
    provider = PackageInfo(
        # Metadata providers must include a type discriminator. We don't need it
        # to collect the providers, but we do need it to write the JSON. We
        # key on the type field to look up the correct block of code to pull
        # data out and format it. We can't to the lookup on the provider class.
        type = "package_info",
        label = ctx.label,
        package_name = ctx.attr.package_name or ctx.build_file_path.rstrip("/BUILD"),
        package_url = ctx.attr.package_url,
        package_version = ctx.attr.package_version,
    )
    # Experimental alternate design, using a generic 'data' back to hold things
    generic_provider = ExperimentalMetadataInfo(
        type = "package_info_alt",
        label = ctx.label,
        data = {
            "package_name": ctx.attr.package_name or ctx.build_file_path.rstrip("/BUILD"),
            "package_url": ctx.attr.package_url,
            "package_version": ctx.attr.package_version
        }
    )
    return [provider, generic_provider]

_package_info = rule(
    implementation = _package_info_impl,
    attrs = {
        "package_name": attr.string(
            doc = "A human readable name identifying this package." +
                  " This may be used to produce an index of OSS packages used by" +
                  " an applicatation.",
        ),
        "package_url": attr.string(
            doc = "The URL this instance of the package was download from." +
                  " This may be used to produce an index of OSS packages used by" +
                  " an applicatation.",
        ),
        "package_version": attr.string(
            doc = "A human readable version string identifying this package." +
                  " This may be used to produce an index of OSS packages used" +
                  " by an applicatation.  It should be a value that" +
                  " increases over time, rather than a commit hash."
        ),
    },
)

# buildifier: disable=function-docstring-args
def package_info(
        name,
        package_name = None,
        package_url = None,
        package_version = None,
        **kwargs):
    """Wrapper for package_info rule.

    @wraps(_package_info)

    Args:
      name: str target name.
      package_name: str A human readable name identifying this package. This
                    may be used to produce an index of OSS packages used by
                    an application.
      package_url: str The canoncial URL this package distribution was retrieved from.
                       Note that, because of local mirroring, that might not be the 
                       physical URL it was retrieved from.
      package_version: str A human readable name identifying version of this package.
      kwargs: other args. Most are ignored.
    """
    visibility = kwargs.get("visibility") or ["//visibility:public"]
    _package_info(
        name = name,
        package_name = package_name,
        package_url = package_url,
        package_version = package_version,
        applicable_licenses = [],
        visibility = visibility,
        tags = [],
        testonly = 0,
    )
