// 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.experimental.startup.instrumentation;

import static com.android.tools.r8.utils.SystemPropertyUtils.getSystemPropertyForDevelopment;
import static com.android.tools.r8.utils.SystemPropertyUtils.parseSystemPropertyForDevelopmentOrDefault;

public class StartupInstrumentationOptions {

  /**
   * When enabled, the instrumentation for synthetics will print the name of the synthetic context
   * instead of printing the name of the synthetic itself.
   */
  private boolean enableGeneralizationOfSyntheticsToSyntheticContext =
      parseSystemPropertyForDevelopmentOrDefault(
          "com.android.tools.r8.startup.instrumentation.generalizesynthetics", false);

  /**
   * When enabled, each method will be instrumented to notify the startup InstrumentationServer that
   * it has been executed.
   *
   * <p>This will also inject the startup runtime library (i.e., the InstrumentationServer) into the
   * app.
   */
  private boolean enableStartupInstrumentation =
      parseSystemPropertyForDevelopmentOrDefault(
          "com.android.tools.r8.startup.instrumentation.instrument", false);

  /**
   * Specifies the synthetic context of the startup runtime library. When this is set, the startup
   * runtime library will only be injected into the app when the synthetic context is in the
   * program. This can be used to avoid that the startup runtime library is injected multiple times
   * in presence of separate compilation.
   *
   * <p>Example synthetic context: "app.tivi.home.MainActivity".
   *
   * <p>Note that this is only meaningful when {@link #enableStartupInstrumentation} is set to true.
   */
  private String startupInstrumentationServerSyntheticContext =
      getSystemPropertyForDevelopment(
          "com.android.tools.r8.startup.instrumentation.instrumentationserversyntheticcontext");

  /**
   * Specifies the logcat tag that should be used by the InstrumentationServer when logging events.
   *
   * <p>When a logcat tag is not specified, the InstrumentationServer will not print events to
   * logcat. Instead, the startup events must be obtained by requesting the InstrumentationServer to
   * write the events to a file.
   */
  private String startupInstrumentationTag =
      getSystemPropertyForDevelopment(
          "com.android.tools.r8.startup.instrumentation.instrumentationtag");

  public boolean hasStartupInstrumentationServerSyntheticContext() {
    return startupInstrumentationServerSyntheticContext != null;
  }

  public String getStartupInstrumentationServerSyntheticContext() {
    return startupInstrumentationServerSyntheticContext;
  }

  public StartupInstrumentationOptions setStartupInstrumentationServerSyntheticContext(
      String startupInstrumentationServerSyntheticContext) {
    this.startupInstrumentationServerSyntheticContext =
        startupInstrumentationServerSyntheticContext;
    return this;
  }

  public boolean hasStartupInstrumentationTag() {
    return startupInstrumentationTag != null;
  }

  public String getStartupInstrumentationTag() {
    return startupInstrumentationTag;
  }

  public StartupInstrumentationOptions setStartupInstrumentationTag(
      String startupInstrumentationTag) {
    this.startupInstrumentationTag = startupInstrumentationTag;
    return this;
  }

  public boolean isGeneralizationOfSyntheticsToSyntheticContextEnabled() {
    return enableGeneralizationOfSyntheticsToSyntheticContext;
  }

  public StartupInstrumentationOptions setEnableGeneralizationOfSyntheticsToSyntheticContext(
      boolean enableGeneralizationOfSyntheticsToSyntheticContext) {
    this.enableGeneralizationOfSyntheticsToSyntheticContext =
        enableGeneralizationOfSyntheticsToSyntheticContext;
    return this;
  }

  public boolean isStartupInstrumentationEnabled() {
    return enableStartupInstrumentation;
  }

  public StartupInstrumentationOptions setEnableStartupInstrumentation() {
    enableStartupInstrumentation = true;
    return this;
  }
}
