load("@rules_proto//proto:defs.bzl", "ProtoInfo")

def _proto_docs(ctx):
    protos = [proto[ProtoInfo] for proto in ctx.attr.protos]
    transitive_sources = depset(transitive = [proto.transitive_sources for proto in protos])
    transitive_proto_path = depset(transitive = [proto.transitive_proto_path for proto in protos])

    out = ctx.actions.declare_file(ctx.label.name + ".html")

    args = []
    args.append("--plugin")
    args.append(ctx.executable._protoc_gen_doc.path)
    args.append("--doc_out")
    args.append(out.dirname)
    args.append("--doc_opt=html," + out.basename)

    for include_path in transitive_proto_path.to_list():
        args.append("-I")
        args.append(include_path)

    for src in transitive_sources.to_list():
        # Due to the built-in import path for well-known types (see AddDefaultProtoPaths
        # in @com_google_protobuf//src/google/protobuf/compiler:command_line_interface.cc)
        # in protoc the Bazel-generated well-known protos are considered to contain
        #  "duplicate" types.
        # Since generating documentation for well-known types is not that useful just
        # skip them.
        if src.path.find("/bin/external/com_google_protobuf/_virtual_imports/") != -1:
            continue
        args.append(src.path)

    ctx.actions.run(
        tools = [ctx.executable._protoc_gen_doc],
        inputs = transitive_sources,
        outputs = [out],
        executable = ctx.executable._protoc,
        arguments = args,
    )
    return [DefaultInfo(files = depset([out]))]

proto_docs = rule(
    implementation = _proto_docs,
    doc = """
        Generate a single HTML documentation file documenting all types and services from the transitive set of
        Protobuf files referenced by all proto_libraries passed into `protos`.
    """,
    attrs = {
        "protos": attr.label_list(
            doc = "A list of protobuf libraries for which (and their dependencies) documentation should be generated for",
            providers = [ProtoInfo],
            default = [],
        ),
        "_protoc": attr.label(
            default = Label("@com_google_protobuf//:protoc"),
            cfg = "exec",
            executable = True,
            allow_files = True,
        ),
        "_protoc_gen_doc": attr.label(
            default = Label("@com_github_pseudomuto_protoc_gen_doc//cmd/protoc-gen-doc"),
            cfg = "exec",
            executable = True,
            allow_files = True,
        ),
    },
)
