// Copyright (c) 2018, 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 com.android.tools.r8;

import com.android.tools.r8.R8Command.Builder;
import com.android.tools.r8.TestBase.Backend;
import com.android.tools.r8.origin.Origin;
import com.android.tools.r8.utils.InternalOptions;
import com.android.tools.r8.utils.StringUtils;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.function.Consumer;

public class R8TestBuilder extends TestCompilerBuilder<R8Command, Builder, R8TestBuilder> {

  private final R8Command.Builder builder;

  private R8TestBuilder(TestState state, Builder builder, Backend backend) {
    super(state, builder, backend);
    this.builder = builder;
  }

  public static R8TestBuilder create(TestState state, Backend backend) {
    return new R8TestBuilder(state, R8Command.builder(), backend);
  }

  private boolean enableInliningAnnotations = false;

  @Override
  R8TestBuilder self() {
    return this;
  }

  @Override
  void internalCompile(Builder builder, Consumer<InternalOptions> optionsConsumer)
      throws CompilationFailedException {
    if (enableInliningAnnotations) {
      ToolHelper.allowTestProguardOptions(builder);
    }
    ToolHelper.runR8WithoutResult(builder.build(), optionsConsumer);
  }

  public R8TestBuilder addDataResources(List<DataEntryResource> resources) {
    resources.forEach(builder.getAppBuilder()::addDataResource);
    return self();
  }

  public R8TestBuilder addKeepRules(String... rules) {
    return addKeepRules(Arrays.asList(rules));
  }

  public R8TestBuilder addKeepRules(Collection<String> rules) {
    builder.addProguardConfiguration(new ArrayList<>(rules), Origin.unknown());
    return self();
  }

  public R8TestBuilder addKeepAllClassesRule() {
    addKeepRules("-keep class ** { *; }");
    return self();
  }

  public R8TestBuilder addKeepClassRules(Class<?>... classes) {
    for (Class<?> clazz : classes) {
      addKeepRules("-keep class " + clazz.getTypeName());
    }
    return self();
  }

  public R8TestBuilder addKeepPackageRules(Package pkg) {
    return addKeepRules("-keep class " + pkg.getName() + ".*");
  }

  public R8TestBuilder addKeepMainRule(Class<?> mainClass) {
    return addKeepRules(
        StringUtils.joinLines(
            "-keep class " + mainClass.getTypeName() + " {",
            "  public static void main(java.lang.String[]);",
            "}"));
  }

  public R8TestBuilder enableInliningAnnotations() {
    if (!enableInliningAnnotations) {
      enableInliningAnnotations = true;
      addKeepRules(
          "-forceinline class * { @com.android.tools.r8.ForceInline *; }",
          "-neverinline class * { @com.android.tools.r8.NeverInline *; }");
    }
    return self();
  }

  public R8TestBuilder enableProguardTestOptions() {
    builder.allowTestProguardOptions();
    return self();
  }
}
