# Copyright 2018 The Bazel Authors. All rights reserved.
#
# 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.
load("//kotlin:kotlin.bzl", _for_ide = "kt_jvm_library")

_BOOTSTRAP_LIB_ARGS = ["-jvm-target", "1.8"]

def _resolve_dep_label(d):
    if d.startswith("///src/main/kotlin/io/bazel/kotlin") and not d.endswith("_for_ide"):
        prefix, _, target = d.rpartition(":")
        if target == None:
            # untested
            return d + "_for_ide"
        else:
            _, _, target = d.rpartition("/")
            return d + ":" + target + "_for_ide"
    else:
        return d

def kt_bootstrap_library(name, srcs, visibility = [], deps = [], neverlink_deps = [], runtime_deps = []):
    """
    Simple compilation of a kotlin library using a non-persistent worker. The target is a JavaInfo provider.

    The target is tagged `"no-ide"` as intellij can't compile it. A seperate private target is created which is suffixed
    with `_for_ide`. If the dep is under the package `//src/main/kotlin/io/bazel/kotlin/builder/...` then it will be
    added to the `_for_ide` target by adding a `_for_ide` prefix.

    deps: the dependenices, the are setup as runtime_deps of the library.
    neverlink_deps: deps that won't be linked. These deps are added to the `"for_ide"` target.
    """
    jar_label = name + "_jar"
    dep_label = name + "_deps"
    native.filegroup(
        name = dep_label,
        srcs = deps + neverlink_deps,
        tags = ["no-ide"],
        visibility = ["//visibility:private"],
    )
    command = """
function join_by { local IFS="$$1"; shift; echo "$$*"; }
case "$$(uname -s)" in
    CYGWIN*|MINGW32*|MSYS*)
        SEP=";"
        ;;
    *)
        SEP=":"
        ;;
esac
NAME=%s
CP="$$(join_by $$SEP $(locations :%s))"
ARGS="%s"

$(JAVA) -Xmx256M -Xms32M -noverify \
  -cp $(location @com_github_jetbrains_kotlin//:kotlin-preloader) org.jetbrains.kotlin.preloading.Preloader \
  -cp $(location @com_github_jetbrains_kotlin//:kotlin-compiler) org.jetbrains.kotlin.cli.jvm.K2JVMCompiler \
  -cp $${CP} -d $(@D)/$${NAME}_temp.jar $${ARGS} $(SRCS)

case "$(location @bazel_tools//tools/jdk:singlejar)" in
    *.jar)
        SJ="$(JAVA) -jar $(location @bazel_tools//tools/jdk:singlejar)"
        ;;
    *)
        SJ="$(location @bazel_tools//tools/jdk:singlejar)"
        ;;
esac

$$SJ \
    --normalize \
    --compression \
    --sources $(@D)/$${NAME}_temp.jar \
    --output $(OUTS)

rm $(@D)/$${NAME}_temp.jar
""" % (name, dep_label, " ".join(_BOOTSTRAP_LIB_ARGS))
    native.genrule(
        name = jar_label,
        tools = [
            "@com_github_jetbrains_kotlin//:home",
            "@com_github_jetbrains_kotlin//:kotlin-preloader",
            "@com_github_jetbrains_kotlin//:kotlin-compiler",
            "@bazel_tools//tools/jdk:singlejar",
            dep_label,
        ],
        srcs = srcs,
        outs = [name + ".jar"],
        tags = ["no-ide"],
        visibility = ["//visibility:private"],
        toolchains = [
            "@bazel_tools//tools/jdk:current_host_java_runtime",
        ],
        cmd = command,
    )
    native.java_import(
        name = name,
        jars = [jar_label],
        tags = ["no-ide"],
        runtime_deps = deps + runtime_deps,
        visibility = visibility,
    )

    # hsyed todo this part of the graph should not be wired up outside of development.
    _for_ide(
        name = name + "_for_ide",
        srcs = srcs,
        neverlink = 1,
        deps = [_resolve_dep_label(d) for d in deps] + neverlink_deps,
        visibility = ["//visibility:private"],
    )
