"""BUILD rules to generate gRPC service interfaces.
You need to load the rules in your BUILD file for use, like:
load("//third_party/grpc:build_defs.bzl", "java_grpc_library")
"""
def _path_ignoring_repository(f):
  if (len(f.owner.workspace_root) == 0):
    return f.short_path
  return f.path[len(f.owner.workspace_root)+1:]

def _gensource_impl(ctx):
  if len(ctx.attr.srcs) > 1:
    fail("Only one src value supported", "srcs")
  for s in ctx.attr.srcs:
    if s.label.package != ctx.label.package:
      print(("in srcs attribute of {0}: Proto source with label {1} should be in "
             + "same package as consuming rule").format(ctx.label, s.label))
  srcdotjar = ctx.new_file(ctx.label.name + ".jar")
  srcs = [f for dep in ctx.attr.srcs for f in dep.proto.direct_sources]
  includes = [f for dep in ctx.attr.srcs for f in dep.proto.transitive_imports]

  ctx.action(
      command = " ".join([
          ctx.executable._protoc.path,
          "--plugin=protoc-gen-grpc-java={0}".format(ctx.executable._java_plugin.path),
          "--grpc-java_out=enable_deprecated={0}:{1}".format(str(ctx.attr.enable_deprecated).lower(), srcdotjar.path)]
          + ["-I{0}={1}".format(_path_ignoring_repository(include), include.path) for include in includes]
          + [src.path for src in srcs]),
      inputs = [ctx.executable._java_plugin, ctx.executable._protoc] + srcs + includes,
      outputs = [srcdotjar],
      use_default_shell_env=True)

  ctx.action(
      command = "cp '%s' '%s'" % (srcdotjar.path, ctx.outputs.srcjar.path),
      inputs = [srcdotjar],
      outputs = [ctx.outputs.srcjar])

_java_grpc_gensource = rule(
    attrs = {
        "srcs": attr.label_list(
            mandatory = True,
            non_empty = True,
            providers = ["proto"],
        ),
        "enable_deprecated": attr.bool(
            default = False,
        ),
        "_protoc": attr.label(
            default = Label("@com_google_protobuf//:protoc"),
            executable = True,
            cfg = "host",
            allow_files = True,
            single_file = True,
        ),
        "_java_plugin": attr.label(
            default = Label("@//third_party/grpc:grpc-java-plugin"),
            executable = True,
            cfg = "host",
        ),
    },
    outputs = {
        "srcjar": "%{name}.srcjar",
    },
    implementation = _gensource_impl,
)

def java_grpc_library(name, srcs, deps, enable_deprecated=None, visibility=None, constraints=None, **kwargs):
  """Generates and compiles gRPC Java sources for services defined in a proto
  file. This rule is compatible with proto_library with java_api_version,
  java_proto_library, and java_lite_proto_library.
  Do note that this rule only scans through the proto file for RPC services. It
  does not generate Java classes for proto messages. You will need a separate
  proto_library with java_api_version, java_proto_library, or
  java_lite_proto_library rule.
  Args:
    name: (str) A unique name for this rule. Required.
    srcs: (list) a single proto_library target that contains the schema of the
        service. Required.
    deps: (list) a single java_proto_library target for the proto_library in
        srcs.  Required.
    visibility: (list) the visibility list
    **kwargs: Passed through to generated targets
  """
  gensource_name = name + "_srcs"
  _java_grpc_gensource(
      name = gensource_name,
      srcs = srcs,
      enable_deprecated = enable_deprecated,
      visibility = ["//visibility:private"],
      tags = [
          "avoid_dep",
      ],
      **kwargs
  )
  native.java_library(
      name = name,
      srcs = [gensource_name],
      visibility = visibility,
      deps = [
          "@//third_party:jsr305",
          "@//third_party/grpc:grpc-jar",
          "@//third_party:guava",
          "@com_google_protobuf//:protobuf_java",
      ] + deps,
      **kwargs
  )
