# Copyright 2023 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.

"""
Implementation for the macro to generate a console_script py_binary from an 'entry_points.txt' config.
"""

load("//python:py_binary.bzl", "py_binary")
load(":py_console_script_gen.bzl", "py_console_script_gen")

def _dist_info(pkg):
    """Return the first candidate for the dist_info target label.

    We cannot do `Label(pkg)` here because the string will be evaluated within
    the context of the rules_python repo_mapping and it will fail because
    rules_python does not know anything about the hub repos that the user has
    available.

    NOTE: Works with assuming the following label formats:
        * @pypi//pylint
        * @pypi//pylint:pkg
        * Label("@pypi//pylint:pkg")
    """

    # str() is called to convert Label objects
    return str(pkg).replace(":pkg", "") + ":dist_info"

def py_console_script_binary(
        *,
        name,
        pkg,
        entry_points_txt = None,
        script = None,
        binary_rule = py_binary,
        **kwargs):
    """Generate a py_binary for a console_script entry_point.

    Args:
        name: [`target-name`] The name of the resulting target.
        pkg: {any}`simple label` the package for which to generate the script.
        entry_points_txt: optional [`label`], the entry_points.txt file to parse
            for available console_script values. It may be a single file, or a
            group of files, but must contain a file named `entry_points.txt`.
            If not specified, defaults to the `dist_info` target in the same
            package as the `pkg` Label.
        script: [`str`], The console script name that the py_binary is going to be
            generated for. Defaults to the normalized name attribute.
        binary_rule: {any}`rule callable`, The rule/macro to use to instantiate
            the target. It's expected to behave like {any}`py_binary`.
            Defaults to {any}`py_binary`.
        **kwargs: Extra parameters forwarded to `binary_rule`.
    """
    main = "rules_python_entry_point_{}.py".format(name)

    if kwargs.pop("srcs", None):
        fail("passing 'srcs' attribute to py_console_script_binary is unsupported")

    py_console_script_gen(
        name = "_{}_gen".format(name),
        entry_points_txt = entry_points_txt or _dist_info(pkg),
        out = main,
        console_script = script,
        console_script_guess = name,
        visibility = ["//visibility:private"],
    )

    binary_rule(
        name = name,
        srcs = [main],
        main = main,
        deps = [pkg] + kwargs.pop("deps", []),
        **kwargs
    )
