"""Custom rule for creating IntelliJ plugin tests.
"""

load(
    "//build_defs:build_defs.bzl",
    "api_version_txt",
)

def intellij_unit_test_suite(name, srcs, test_package_root, **kwargs):
  """Creates a java_test rule comprising all valid test classes in the specified srcs.

  Only classes ending in "Test.java" will be recognized.

  Args:
    name: name of this rule.
    srcs: the test classes.
    test_package_root: only tests under this package root will be run.
    **kwargs: Any other args to be passed to the java_test.
  """
  test_srcs = [test for test in srcs if test.endswith("Test.java")]
  test_classes = [_get_test_class(test_src, test_package_root) for test_src in test_srcs]
  suite_class_name = name + "TestSuite"
  suite_class = test_package_root + "." + suite_class_name
  _generate_test_suite(
      name = suite_class_name,
      test_package_root = test_package_root,
      test_classes = test_classes,
  )
  native.java_test(
      name = name,
      srcs = srcs + [suite_class_name],
      test_class = suite_class,
      **kwargs)

def intellij_integration_test_suite(
    name,
    srcs,
    test_package_root,
    deps,
    jvm_flags = [],
    runtime_deps = [],
    platform_prefix="Idea",
    required_plugins=None,
    **kwargs):
  """Creates a java_test rule comprising all valid test classes in the specified srcs.

  Only classes ending in "Test.java" will be recognized.

  All test classes must be located in the blaze package calling this function.

  Args:
    name: name of this rule.
    srcs: the test classes.
    test_package_root: only tests under this package root will be run.
    deps: the required deps.
    jvm_flags: extra flags to be passed to the test vm.
    runtime_deps: the required runtime_deps.
    platform_prefix: Specifies the JetBrains product these tests are run against. Examples are
        'Idea' (IJ CE), 'idea' (IJ UE), 'CLion', 'AndroidStudio'. See
        com.intellij.util.PlatformUtils for other options.
    required_plugins: optional comma-separated list of plugin IDs. Integration tests will fail if
        these plugins aren't loaded at runtime.
    **kwargs: Any other args to be passed to the java_test.
  """
  test_srcs = [test for test in srcs if test.endswith("Test.java")]
  test_classes = [_get_test_class(test_src, test_package_root) for test_src in test_srcs]
  suite_class_name = name + "TestSuite"
  suite_class = test_package_root + "." + suite_class_name
  _generate_test_suite(
      name = suite_class_name,
      test_package_root = test_package_root,
      test_classes = test_classes,
      class_rules = ["com.google.idea.testing.BlazeTestSystemPropertiesRule"]
  )

  api_version_txt_name = name + "_api_version"
  api_version_txt(name = api_version_txt_name)
  data = kwargs.pop("data", [])
  data.append(api_version_txt_name)

  deps = list(deps)
  deps.extend([
      "//testing:lib",
  ])
  runtime_deps = list(runtime_deps)
  runtime_deps.extend([
      "//intellij_platform_sdk:bundled_plugins",
      "//third_party:jdk8_tools",
  ])

  jvm_flags = list(jvm_flags)
  jvm_flags.extend([
      "-Didea.classpath.index.enabled=false",
      "-Djava.awt.headless=true",
      "-Didea.platform.prefix=" + platform_prefix,
      "-Dblaze.idea.api.version.file=$(location %s)" % api_version_txt_name
  ])

  if required_plugins:
    jvm_flags.append("-Didea.required.plugins.id=" + required_plugins)

  native.java_test(
      name = name,
      size = "medium",
      srcs = srcs + [suite_class_name],
      data = data,
      jvm_flags = jvm_flags,
      test_class = suite_class,
      runtime_deps = runtime_deps,
      deps = deps,
      **kwargs
  )

def _generate_test_suite(name, test_package_root, test_classes, class_rules = []):
  """Generates a JUnit4 test suite pulling in all the referenced classes.

  Args:
    name: the name of the genrule and output test suite class.
    test_package_root: the package string of the output test suite.
    test_classes: the test classes included in the suite.
    class_rules: optional list of classes to instantiate as a @ClassRule in the test suite.
  """
  lines = []
  lines.append("package %s;" % test_package_root)
  lines.append("")
  if (class_rules):
    lines.append("import org.junit.ClassRule;")
  lines.append("import org.junit.runner.RunWith;")
  lines.append("import org.junit.runners.Suite;")
  lines.append("")
  for test_class in test_classes:
    lines.append("import %s;" % test_class)
  lines.append("")
  lines.append("@RunWith(Suite.class)")
  lines.append("@Suite.SuiteClasses({")
  for test_class in test_classes:
    lines.append("    %s.class," % test_class.split(".")[-1])
  lines.append("})")
  lines.append("public class %s {" % name)
  lines.append("")

  i = 1
  for class_rule in class_rules:
    lines.append("@ClassRule")
    lines.append("public static %s setupRule_%d = new %s();" % (class_rule, i, class_rule))
    i += 1

  lines.append("}")

  contents = "\\n".join(lines)
  native.genrule(
      name = name,
      cmd = "printf '%s' > $@" % contents,
      outs = [name + ".java"],
  )

def _get_test_class(test_src, test_package_root):
  """Returns the package string of the test class, beginning with the given root."""
  full_path = PACKAGE_NAME + "/" + test_src
  temp = full_path[:-5]
  temp = temp.replace("/", ".")
  i = temp.rfind(test_package_root)
  if i < 0:
    fail("Test source '%s' not under package root '%s'" % (full_path, test_package_root))
  test_class = temp[i:]
  return test_class
