load("@rules_java//java/common:java_info.bzl", "JavaInfo")
load("//java/private:module.bzl", "JavaModuleInfo")

MavenInfo = provider(
    fields = {
        "coordinates": "Maven coordinates of the library we're building (optional)",
        "artifact_jars": "Jars to include within the artifact when we build it",
        "source_jars": "Source jars to include within the maven source jar",
        "maven_deps": "Maven coordinates that this module depends on",
        "transitive_maven_deps": "All maven coordinates that are transitive dependencies",
        "transitive_runtime_jars": "Transitive set of jars that this library depends on (including artifact_jars)",
        "transitive_source_jars": "Transitive set of source jars that this library depends on",
    },
)

MAVEN_PREFIX = "maven_coordinates="

def _has_maven_deps_impl(target, ctx):
    java_info = target[JavaInfo]

    tags = getattr(ctx.rule.attr, "tags", [])
    deps = getattr(ctx.rule.attr, "deps", [])
    exports = getattr(ctx.rule.attr, "exports", [])
    rt_deps = getattr(ctx.rule.attr, "runtime_deps", [])
    all_deps = deps + exports + rt_deps

    if "maven:compile_only" in tags:
        return MavenInfo(
            coordinates = None,
            maven_deps = depset(),
            artifact_jars = depset(),
            source_jars = depset(),
            transitive_maven_deps = depset(),
            transitive_runtime_jars = depset(),
        )

    # Find all the deps that have coordinates
    all_infos = [dep[MavenInfo] for dep in all_deps if MavenInfo in dep]

    maven_deps = depset([], transitive = [info.transitive_maven_deps for info in all_infos])

    # Because of the way that maven works, if a rule has maven coordinates,
    # it's enough to set set the transitive deps to just be the rule for
    # anything that depends upon it. Otherwise, gather them up, and carry on
    # as if nothing really mattered.
    coordinate = read_coordinates(tags)
    if coordinate:
        transitive_maven_deps = depset([coordinate])
    else:
        transitive_maven_deps = depset(transitive = [info.transitive_maven_deps for info in all_infos])
    artifact_jars = depset(java_info.runtime_output_jars, transitive = [info.artifact_jars for info in all_infos if not info.coordinates])
    source_jars = depset(java_info.source_jars, transitive = [info.source_jars for info in all_infos if not info.coordinates])

    infos = []

    if JavaModuleInfo in target:
        info = MavenInfo(
            coordinates = coordinate,
            maven_deps = maven_deps,
            artifact_jars = depset(target[JavaInfo].runtime_output_jars),
            source_jars = depset(target[JavaInfo].source_jars),
            transitive_maven_deps = transitive_maven_deps,
            transitive_runtime_jars = depset(target[JavaInfo].transitive_runtime_jars.to_list(), transitive = [info.transitive_runtime_jars for info in all_infos]),
        )
    else:
        info = MavenInfo(
            coordinates = coordinate,
            maven_deps = maven_deps,
            artifact_jars = artifact_jars,
            source_jars = source_jars,
            transitive_maven_deps = transitive_maven_deps,
            transitive_runtime_jars = depset(target[JavaInfo].transitive_runtime_jars.to_list(), transitive = [info.transitive_runtime_jars for info in all_infos]),
        )
    infos.append(info)

    return infos

has_maven_deps = aspect(
    implementation = _has_maven_deps_impl,
    attr_aspects = [
        "deps",
        "exports",
        "runtime_deps",
    ],
)

def combine_jars(ctx, singlejar, inputs, output):
    args = ctx.actions.args()
    args.add("--output", output)
    args.add_all(inputs, before_each = "--sources")

    ctx.actions.run(
        mnemonic = "BuildMavenJar",
        inputs = inputs,
        outputs = [output],
        executable = singlejar,
        arguments = [args],
    )

def explode_coordinates(coords):
    """Takes a maven coordinate and explodes it into a tuple of
    (groupId, artifactId, version, type, classifier)
    """
    if not coords:
        return None

    parts = coords.split(":")
    if len(parts) == 3:
        return (parts[0], parts[1], parts[2], "jar", "jar")
    if len(parts) == 4:
        # Assume a buildr coordinate: groupId:artifactId:type:version
        return (parts[0], parts[1], parts[3], parts[2], "jar")
    if len(parts) == 5:
        # Assume groupId:artifactId:type:classifier:version
        return (parts[0], parts[1], parts[4], parts[2], parts[3])

    fail("Unparsed: %s -> %s" % (coords, parts))

def read_coordinates(tags):
    coordinates = []
    for tag in tags:
        if tag == "maven:compile_only":
            return []
        if tag.startswith(MAVEN_PREFIX):
            coordinates.append(tag[len(MAVEN_PREFIX):])
    if len(coordinates) > 1:
        fail("Zero or one set of coordinates should be defined: %s" % coordinates)
    return coordinates[0] if len(coordinates) else None
