# Copyright 2019 Google LLC
#
# Redistribution and use in source and binary forms, with or without
# modification, are permitted provided that the following conditions are
# met:
#
#     * Redistributions of source code must retain the above copyright
# notice, this list of conditions and the following disclaimer.
#     * Redistributions in binary form must reproduce the above
# copyright notice, this list of conditions and the following disclaimer
# in the documentation and/or other materials provided with the
# distribution.
#     * Neither the name of Google LLC nor the names of its
# contributors may be used to endorse or promote products derived from
# this software without specific prior written permission.
#
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

def java_tests(name, srcs, runtime_deps, size):
    classNames = []
    for src in srcs:
        # convert .java file path to fully qualified class name
        className = src[(src.index("/com/") + 1):-5].replace("/", ".")
        classNames.append(className)
        native.java_test(
            name = className,
            test_class = className,
            runtime_deps = runtime_deps,
            size = size,
        )
    if classNames:
        native.test_suite(
            name = name,
            tests = classNames,
        )

def google_java_format(name, srcs, formatter):
    native.genrule(
        name = name,
        outs = ["%s.sh" % name],
        srcs = srcs,
        # TODO: this may fail if list of files is too long (exceeds max command line limit in shell).
        #       Split the command into multiple executions if this ever fails (good enough for now)
        cmd = "echo ' $(location %s) --replace $(SRCS)' > $@" % formatter,
        executable = True,
        tools = [formatter],
        local = 1,
    )

def _google_java_format_verification_impl(ctx):
    src_files = [src.path for src in ctx.files.srcs]
    output_file = ctx.outputs.output_file
    formatter = ctx.executable.formatter

    ctx.actions.run_shell(
        inputs = ctx.files.srcs,
        arguments = ["--dry-run", "--set-exit-if-changed"] + src_files,
        tools = [formatter],
        command = "%s $@ > %s" % (formatter.path, output_file.path),
        outputs = [output_file],
        progress_message =
            "If this target fails check the list of files that must be formatted in %s" % output_file.path,
    )

google_java_format_verification = rule(
    attrs = {
        "srcs": attr.label_list(allow_files = True),
        "formatter": attr.label(
            executable = True,
            cfg = "host",
        ),
    },
    outputs = {"output_file": "%{name}.txt"},
    implementation = _google_java_format_verification_impl,
)
