# Copyright 2015 gRPC authors.
#
# 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.

"""
Bazel macros to declare gRPC libraries automatically generated from proto files.

This file declares two macros:
- objc_proto_library
- objc_grpc_library
"""

def _lower_underscore_to_upper_camel(str):
    humps = []
    for hump in str.split("_"):
        humps += [hump[0].upper() + hump[1:]]
    return "".join(humps)

def _file_to_upper_camel(src):
    elements = src.rpartition("/")
    upper_camel = _lower_underscore_to_upper_camel(elements[-1])
    return "".join(elements[:-1] + [upper_camel])

def _file_with_extension(src, ext):
    elements = src.rpartition("/")
    basename = elements[-1].partition(".")[0]
    return "".join(elements[:-1] + [basename, ext])

def _protoc_invocation(srcs, flags):
    """Returns a command line to invoke protoc from a genrule, on the given
    sources, using the given flags.
    """
    protoc_command = "$(location //external:protoc) -I . "
    srcs_params = ""
    for src in srcs:
        srcs_params += " $(location %s)" % (src)
    return protoc_command + flags + srcs_params

def objc_proto_library(name, srcs, visibility = None):
    """Declares an objc_library for the code generated by protoc from the given
    proto sources. This generated code doesn't include proto services.
    """
    h_files = []
    m_files = []
    for src in srcs:
        src = _file_to_upper_camel(src)
        h_files += [_file_with_extension(src, ".pbobjc.h")]
        m_files += [_file_with_extension(src, ".pbobjc.m")]

    protoc_flags = "--objc_out=$(GENDIR)"

    native.genrule(
        name = name + "_codegen",
        srcs = srcs + ["//external:protoc"],
        outs = h_files + m_files,
        cmd = _protoc_invocation(srcs, protoc_flags),
    )
    native.objc_library(
        name = name,
        hdrs = h_files,
        includes = ["."],
        non_arc_srcs = m_files,
        deps = ["//external:protobuf_objc"],
        visibility = visibility,
    )

def objc_grpc_library(name, services, other_messages, visibility = None):
    """Declares an objc_library for the code generated by gRPC and protoc from the
    given proto sources (services and other_messages). The generated code doesn't
    include proto services of the files passed as other_messages.
    """
    objc_proto_library(name + "_messages", services + other_messages)

    h_files = []
    m_files = []
    for src in services:
        src = _file_to_upper_camel(src)
        h_files += [_file_with_extension(src, ".pbrpc.h")]
        m_files += [_file_with_extension(src, ".pbrpc.m")]

    protoc_flags = ("--grpc_out=$(GENDIR) --plugin=" +
                    "protoc-gen-grpc=$(location //external:grpc_protoc_plugin_objc)")

    native.genrule(
        name = name + "_codegen",
        srcs = services + [
            "//external:grpc_protoc_plugin_objc",
            "//external:protoc",
        ],
        outs = h_files + m_files,
        cmd = _protoc_invocation(services, protoc_flags),
    )
    native.objc_library(
        name = name,
        hdrs = h_files,
        includes = ["."],
        srcs = m_files,
        deps = [
            ":" + name + "_messages",
            "//external:proto_objc_rpc",
        ],
        visibility = visibility,
    )
