// Copyright (c) 2016, 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 dx;

import java.io.File;
import java.io.IOException;
import org.gradle.api.Action;
import org.gradle.api.DefaultTask;
import org.gradle.api.UncheckedIOException;
import org.gradle.api.file.FileTree;
import org.gradle.api.tasks.TaskAction;
import org.gradle.process.ExecSpec;
import utils.Utils;

public class Dx extends DefaultTask {

  private FileTree source;
  private File destination;
  private File dxExecutable;
  private boolean debug;

  public FileTree getSource() {
    return source;
  }

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

  public File getDestination() {
    return destination;
  }

  public void setDestination(File destination) {
    this.destination = destination;
    File classesFile = destination.toPath().resolve("classes.dex").toFile();
    // The output from running DX is classes.dex in the destination directory.
    // TODO(sgjesse): Handle multidex?
    getOutputs().file(classesFile);
  }

  public File getDxExecutable() {
    return dxExecutable;
  }

  public void setDxExecutable(File dxExecutable) {
    this.dxExecutable = dxExecutable;
  }

  public boolean isDebug() {
    return debug;
  }

  public void setDebug(boolean debug) {
    this.debug = debug;
  }

  @TaskAction
  void exec() {
    getProject().exec(new Action<ExecSpec>() {
      @Override
      public void execute(ExecSpec execSpec) {
        try {
          if (dxExecutable == null) {
            dxExecutable = new File("tools/" + Utils.toolsDir() + "/dx/bin/dx");
          }
          execSpec.setExecutable(dxExecutable);
          execSpec.args("--dex");
          execSpec.args("--output");
          execSpec.args(destination.getCanonicalPath());
          if (isDebug()) {
            execSpec.args("--debug");
          }
          execSpec.args(source.getFiles());
        } catch (IOException e) {
          throw new UncheckedIOException(e);
        }
      }
    });
  }
}