"""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.to_list()]

  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("@io_bazel//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 = [
          "@io_bazel//third_party:javax_annotations",
          "@io_bazel//third_party:jsr305",
          "@io_bazel//third_party/grpc:grpc-jar",
          "@io_bazel//third_party:guava",
          "@com_google_protobuf//:protobuf_java",
      ] + deps,
      **kwargs
  )
