/*
 * 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.
 */
package io.bazel.kotlin.builder.tasks.jvm;

import io.bazel.kotlin.builder.Deps.AnnotationProcessor;
import io.bazel.kotlin.builder.Deps.Dep;
import io.bazel.kotlin.builder.KotlinBuilderJvmTestTask;
import io.bazel.kotlin.builder.KotlinBuilderResource;
import org.junit.Rule;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.JUnit4;

import java.util.function.Consumer;
import java.util.stream.Collectors;

import static io.bazel.kotlin.builder.KotlinBuilderJvmTestTask.KOTLIN_ANNOTATIONS;
import static io.bazel.kotlin.builder.KotlinBuilderJvmTestTask.KOTLIN_STDLIB;

@RunWith(JUnit4.class)
public class KotlinBuilderJvmKaptTest {
  private static final Dep AUTO_VALUE =
      Dep.importJar(
          "autovalue",
          "external/io_bazel_rules_kotlin_com_google_auto_value_auto_value"
              + "/jar/io_bazel_rules_kotlin_com_google_auto_value_auto_value.jar");
  private static final AnnotationProcessor AUTO_VALUE_ANNOTATION_PROCESSOR =
      AnnotationProcessor.builder()
          .processClass("com.google.auto.value.processor.AutoValueProcessor")
          .processorPath(
              Dep.classpathOf(AUTO_VALUE, KOTLIN_ANNOTATIONS).collect(Collectors.toSet()))
          .build();

  @Rule public KotlinBuilderJvmTestTask ctx = new KotlinBuilderJvmTestTask();

  private static final Consumer<KotlinBuilderJvmTestTask> ADD_AUTO_VALUE_PLUGIN =
      (c) -> {
        c.addAnnotationProcessors(AUTO_VALUE_ANNOTATION_PROCESSOR);
        c.addDirectDependencies(AUTO_VALUE, KOTLIN_STDLIB);
      };

  @Test
  public void testKaptKt() {
    ctx.runCompileTask(
        ADD_AUTO_VALUE_PLUGIN,
        c ->
            c.addSource(
                "TestKtValue.kt",
                "package autovalue\n"
                    + "\n"
                    + "import com.google.auto.value.AutoValue\n"
                    + "\n"
                    + "@AutoValue\n"
                    + "abstract class TestKtValue {\n"
                    + "    abstract fun name(): String\n"
                    + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
                    + "\n"
                    + "    @AutoValue.Builder\n"
                    + "    abstract class Builder {\n"
                    + "        abstract fun setName(name: String): Builder\n"
                    + "        abstract fun build(): TestKtValue\n"
                    + "    }\n"
                    + "}"));

    ctx.assertFilesExist(
        KotlinBuilderResource.DirectoryType.CLASSES,
        "autovalue/TestKtValue.class",
        "autovalue/AutoValue_TestKtValue.class");
    ctx.assertFilesExist(
        KotlinBuilderResource.DirectoryType.SOURCE_GEN, "autovalue/AutoValue_TestKtValue.java");
  }

  @Test
  public void testMixedKaptBiReferences() {
    ctx.runCompileTask(
        ADD_AUTO_VALUE_PLUGIN,
        ctx -> {
          ctx.addSource(
              "TestKtValue.kt",
              "package autovalue.a\n"
                  + "\n"
                  + "import com.google.auto.value.AutoValue\n"
                  + "import autovalue.b.TestAutoValue\n"
                  + "\n"
                  + "@AutoValue\n"
                  + "abstract class TestKtValue {\n"
                  + "    abstract fun name(): String\n"
                  + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
                  + "\n"
                  + "    @AutoValue.Builder\n"
                  + "    abstract class Builder {\n"
                  + "        abstract fun setName(name: String): Builder\n"
                  + "        abstract fun build(): TestKtValue\n"
                  + "    }\n"
                  + "}");

          ctx.addSource(
              "TestAutoValue.java",
              "package autovalue.b;\n"
                  + "\n"
                  + "import com.google.auto.value.AutoValue;\n"
                  + "import autovalue.a.TestKtValue;\n"
                  + "\n"
                  + "@AutoValue\n"
                  + "public abstract class TestAutoValue {\n"
                  + "    abstract String name();\n"
                  + "\n"
                  + "\n"
                  + "    static Builder builder() {\n"
                  + "        return new AutoValue_TestAutoValue.Builder();\n"
                  + "    }\n"
                  + "\n"
                  + "    @AutoValue.Builder\n"
                  + "    abstract static class Builder {\n"
                  + "        abstract Builder setName(String name);\n"
                  + "        abstract TestAutoValue build();\n"
                  + "    }\n"
                  + "\n"
                  + "}");
        });
    ctx.assertFilesExist(
        KotlinBuilderResource.DirectoryType.SOURCE_GEN,
        "autovalue/a/AutoValue_TestKtValue.java",
        "autovalue/b/AutoValue_TestAutoValue.java");
    ctx.assertFilesExist(
        KotlinBuilderResource.DirectoryType.CLASSES,
        "autovalue/a/AutoValue_TestKtValue.class",
        "autovalue/b/AutoValue_TestAutoValue.class");
  }
}
