// Copyright (c) 2022, 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 static com.android.tools.r8.BaseCompilerCommandParser.MAP_DIAGNOSTICS;
import static com.android.tools.r8.BaseCompilerCommandParser.MIN_API_FLAG;
import static com.android.tools.r8.BaseCompilerCommandParser.THREAD_COUNT_FLAG;

import com.android.tools.r8.utils.AndroidApiLevel;
import com.google.common.collect.ImmutableList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;

public class ParseFlagInfoImpl implements ParseFlagInfo {

  private static String defaultSuffix(boolean isDefault) {
    return isDefault ? " (default)" : "";
  }

  public static ParseFlagInfoImpl getRelease(boolean isDefault) {
    return flag0(
        "--release", "Compile without debugging information" + defaultSuffix(isDefault) + ".");
  }

  public static ParseFlagInfoImpl getDebug(boolean isDefault) {
    return flag0("--debug", "Compile with debugging information" + defaultSuffix(isDefault) + ".");
  }

  public static ParseFlagInfoImpl getDex(boolean isDefault) {
    return flag0("--dex", "Compile program to DEX file format" + defaultSuffix(isDefault) + ".");
  }

  public static ParseFlagInfoImpl getClassfile() {
    return flag0("--classfile", "Compile program to Java classfile format.");
  }

  public static ParseFlagInfoImpl getOutput() {
    return flag1(
        "--output",
        "<file>",
        "Output result in <file>.",
        "<file> must be an existing directory or a zip file.");
  }

  public static ParseFlagInfoImpl getLib() {
    return flag1("--lib", "<file|jdk-home>", "Add <file|jdk-home> as a library resource.");
  }

  public static ParseFlagInfoImpl getClasspath() {
    return flag1("--classpath", "<file>", "Add <file> as a classpath resource.");
  }

  public static ParseFlagInfoImpl getMinApi() {
    return flag1(
        MIN_API_FLAG,
        "<number>",
        "Minimum Android API level compatibility (default: "
            + AndroidApiLevel.getDefault().getLevel()
            + ").");
  }

  public static ParseFlagInfoImpl getDesugaredLib() {
    return flag1(
        "--desugared-lib",
        "<file>",
        "Specify desugared library configuration.",
        "<file> is a desugared library configuration (json).");
  }

  public static ParseFlagInfoImpl getMainDexRules() {
    return flag1(
        "--main-dex-rules",
        "<file>",
        "Proguard keep rules for classes to place in the",
        "primary dex file.");
  }

  public static ParseFlagInfoImpl getMainDexList() {
    return flag1("--main-dex-list", "<file>", "List of classes to place in the primary dex file.");
  }

  public static ParseFlagInfoImpl getMainDexListOutput() {
    return flag1("--main-dex-list-output", "<file>", "Output resulting main dex list in <file>.");
  }

  public static ParseFlagInfoImpl getVersion(String tool) {
    return flag0("--version", "Print the version of " + tool + ".");
  }

  public static ParseFlagInfoImpl getHelp() {
    return flag0("--help", "Print this message.");
  }

  public static ParseFlagInfoImpl getPgConf() {
    return ParseFlagInfoImpl.flag1("--pg-conf", "<file>", "Proguard configuration <file>.");
  }

  public static ParseFlagInfoImpl getPgMapOutput() {
    return ParseFlagInfoImpl.flag1(
        "--pg-map-output", "<file>", "Output the resulting name and line mapping to <file>.");
  }

  public static List<ParseFlagInfoImpl> getAssertionsFlags() {
    return ImmutableList.of(
        flag0a1(
            "--force-enable-assertions[:[<class name>|<package name>...]]",
            "--force-ea[:[<class name>|<package name>...]]",
            "Forcefully enable javac generated assertion code."),
        flag0a1(
            "--force-disable-assertions[:[<class name>|<package name>...]]",
            "--force-da[:[<class name>|<package name>...]]",
            "Forcefully disable javac generated assertion code.",
            "This is the default handling of javac assertion code",
            "when generating DEX file format."),
        flag0a1(
            "--force-passthrough-assertions[:[<class name>|<package name>...]]",
            "--force-pa[:[<class name>|<package name>...]]",
            "Don't change javac generated assertion code. This",
            "is the default handling of javac assertion code when",
            "generating class file format."),
        flag0a1(
            "--force-assertions-handler:<handler method>[:[<class name>|<package name>...]]",
            "--force-ah:<handler method>[:[<class name>|<package name>...]]",
            "Change javac and kotlinc generated assertion code",
            "to invoke the method <handler method> with each",
            "assertion error instead of throwing it.",
            "The <handler method> is specified as a class name",
            "followed by a dot and the method name.",
            "The handler method must take a single argument of",
            "type java.lang.Throwable and have return type void."));
  }

  public static ParseFlagInfoImpl getThreadCount() {
    return flag1(
        THREAD_COUNT_FLAG,
        "<number>",
        "Use <number> of threads for compilation.",
        "If not specified the number will be based on",
        "heuristics taking the number of cores into account.");
  }

  public static ParseFlagInfoImpl getMapDiagnostics() {
    return flag2(
        MAP_DIAGNOSTICS + "[:<type>]",
        "<from-level>",
        "<to-level>",
        "Map diagnostics of <type> (default any) reported as",
        "<from-level> to <to-level> where <from-level> and",
        "<to-level> are one of 'info', 'warning', or 'error'",
        "and the optional <type> is either the simple or",
        "fully qualified Java type name of a diagnostic.",
        "If <type> is unspecified, all diagnostics at ",
        "<from-level> will be mapped.",
        "Note that fatal compiler errors cannot be mapped.");
  }

  public static ParseFlagInfoImpl getAndroidPlatformBuild() {
    return flag0(
        "--android-platform-build",
        "Compile as a platform build where the runtime/bootclasspath",
        "is assumed to be the version specified by --min-api.");
  }

  public static ParseFlagInfoImpl flag0(String flag, String... help) {
    return flag(flag, Collections.emptyList(), Arrays.asList(help));
  }

  public static ParseFlagInfoImpl flag1(String flag, String arg, String... help) {
    return flag(flag, Collections.singletonList(arg), Arrays.asList(help));
  }

  public static ParseFlagInfoImpl flag2(String flag, String arg1, String arg2, String... help) {
    return flag(flag, ImmutableList.of(arg1, arg2), Arrays.asList(help));
  }

  private static String fmt(String flag, List<String> args) {
    StringBuilder builder = new StringBuilder(flag);
    for (String arg : args) {
      builder.append(" ").append(arg);
    }
    return builder.toString();
  }

  public static ParseFlagInfoImpl flag(String flag, List<String> args, List<String> help) {
    return new ParseFlagInfoImpl(flag, fmt(flag, args), Collections.emptyList(), help);
  }

  public static ParseFlagInfoImpl flag0a1(String flag, String alternative, String... help) {
    return new ParseFlagInfoImpl(
        null, flag, Collections.singletonList(alternative), Arrays.asList(help));
  }

  // Note that the raw flag may be non-representable as in the case of the family of flags for
  // assertions.
  private final String rawFlag;
  private final String flagWithArgs;
  private final List<String> alternatives;
  private final List<String> flagHelp;

  public ParseFlagInfoImpl(
      String rawFlag, String flagWithArgs, List<String> alternatives, List<String> flagHelp) {
    // Raw flag may be null if it does not have a unique definition.
    assert flagWithArgs != null;
    assert alternatives != null;
    assert flagHelp != null;
    this.rawFlag = rawFlag;
    this.flagWithArgs = flagWithArgs;
    this.alternatives = alternatives;
    this.flagHelp = flagHelp;
  }

  @Override
  public String getFlagFormat() {
    return flagWithArgs;
  }

  @Override
  public List<String> getFlagFormatAlternatives() {
    return alternatives;
  }

  @Override
  public List<String> getFlagHelp() {
    return flagHelp;
  }
}
