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

"""A Starlark implementation of the proto_lang_toolchain rule."""

load(":common/proto/proto_info.bzl", "ProtoInfo")
load(":common/proto/proto_common.bzl", "ProtoLangToolchainInfo")
load(":common/proto/proto_semantics.bzl", "semantics")

def _rule_impl(ctx):
    provided_proto_sources = depset(transitive = [bp[ProtoInfo].transitive_proto_sources() for bp in ctx.attr.blacklisted_protos]).to_list()

    flag = ctx.attr.command_line
    if flag.find("$(PLUGIN_OUT)") > -1:
        fail("in attribute 'command_line': Placeholder '$(PLUGIN_OUT)' is not supported.")
    flag = flag.replace("$(OUT)", "%s")

    plugin = None
    if ctx.attr.plugin != None:
        plugin = ctx.attr.plugin[DefaultInfo].files_to_run

    proto_compiler = getattr(ctx.attr, "proto_compiler", None)
    proto_compiler = getattr(ctx.attr, "_proto_compiler", proto_compiler)

    return [
        DefaultInfo(
            files = depset(),
            runfiles = ctx.runfiles(),
        ),
        ProtoLangToolchainInfo(
            out_replacement_format_flag = flag,
            plugin_format_flag = ctx.attr.plugin_format_flag,
            plugin = plugin,
            runtime = ctx.attr.runtime,
            provided_proto_sources = provided_proto_sources,
            proto_compiler = proto_compiler.files_to_run,
            protoc_opts = ctx.fragments.proto.experimental_protoc_opts,
            progress_message = ctx.attr.progress_message,
            mnemonic = ctx.attr.mnemonic,
        ),
    ]

def make_proto_lang_toolchain(custom_proto_compiler):
    return rule(
        _rule_impl,
        attrs = dict(
            {
                "progress_message": attr.string(default = "Generating proto_library %{label}"),
                "mnemonic": attr.string(default = "GenProto"),
                "command_line": attr.string(mandatory = True),
                "plugin_format_flag": attr.string(),
                "plugin": attr.label(
                    executable = True,
                    cfg = "exec",
                ),
                "runtime": attr.label(),
                "blacklisted_protos": attr.label_list(
                    providers = [ProtoInfo],
                ),
            },
            **({
                "proto_compiler": attr.label(
                    cfg = "exec",
                    executable = True,
                ),
            } if custom_proto_compiler else {
                "_proto_compiler": attr.label(
                    cfg = "exec",
                    executable = True,
                    allow_files = True,
                    default = configuration_field("proto", "proto_compiler"),
                ),
            })
        ),
        provides = [ProtoLangToolchainInfo],
        fragments = ["proto"] + semantics.EXTRA_FRAGMENTS,
    )
