// Copyright (c) 2017, the R8 project authors. Please see the AUTHORS file
// for details. All rights reserved. Use of this source code is governed by a
// BSD-style license that can be found in the LICENSE file.

package kotlin;

import java.io.File;
import java.io.IOException;
import java.nio.file.Path;
import java.nio.file.Paths;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.UncheckedIOException;
import org.gradle.api.file.FileCollection;
import org.gradle.api.file.FileTree;
import org.gradle.api.tasks.InputFiles;
import org.gradle.api.tasks.OutputFile;
import org.gradle.api.tasks.TaskAction;
import org.gradle.process.ExecSpec;
import utils.Utils;

/**
 * Gradle task to compile Kotlin source files. By default the generated classes target Java 1.6.
 */
public class Kotlinc extends DefaultTask {

  private static final String kotlincExecName = Utils.toolsDir().equals("windows")
      ? "kotlinc.bat"
      : "kotlinc";

  private static final Path kotlincExecPath =
      Paths.get(
          "third_party", "kotlin", "kotlin-compiler-1.3.72", "kotlinc", "bin", kotlincExecName);

  enum KotlinTargetVersion {
    JAVA_6("1.6"),
    JAVA_8("1.8");

    private final String optionName;

    KotlinTargetVersion(String optionName) {
      this.optionName = optionName;
    }
  }

  private FileTree source;

  @OutputFile
  private File destination;

  private KotlinTargetVersion targetVersion = KotlinTargetVersion.JAVA_6;

  @InputFiles
  public FileCollection getInputFiles() {
    // Note: Using Path object directly causes stack overflow.
    // See: https://github.com/gradle/gradle/issues/1973
    return source.plus(getProject().files(kotlincExecPath.toFile()));
  }

  public FileTree getSource() {
    return source;
  }

  public void setSource(FileTree source) {
    this.source = source;
  }

  public File getDestination() {
    return destination;
  }

  public void setDestination(File destination) {
    this.destination = destination;
  }

  public KotlinTargetVersion getTargetVersion() {
    return targetVersion;
  }

  public void setTargetVersion(KotlinTargetVersion targetVersion) {
    this.targetVersion = targetVersion;
  }

  @TaskAction
  public void compile() {
    getProject().exec(new Action<ExecSpec>() {
      @Override
      public void execute(ExecSpec execSpec) {
        try {
          execSpec.setExecutable(kotlincExecPath.toFile());
          execSpec.args("-include-runtime");
          execSpec.args("-nowarn");
          execSpec.args("-jvm-target", targetVersion.optionName);
          execSpec.args("-d", destination.getCanonicalPath());
          execSpec.args(source.getFiles());
        } catch (IOException e) {
          throw new UncheckedIOException(e);
        }
      }
    });
  }
}
