// Copyright (c) 2023, 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.keepanno.annotations.KeepForApi;

/**
 * Resource shrinker configuration. Allows building an immutable structure of resource shrinker
 * settings.
 *
 * <p>A {@link ResourceShrinkerConfiguration} can be added to a {@link R8Command} change the way
 * resource shrinking is performed.
 *
 * <p>To build a {@link ResourceShrinkerConfiguration} use the {@link
 * ResourceShrinkerConfiguration.Builder} class, available through the {@link R8Command.Builder}.
 * For example:
 *
 * <pre>
 *   R8Command command = R8Command.builder()
 *     .addProgramFiles(path1, path2)
 *     .setMode(CompilationMode.RELEASE)
 *     .setProgramConsumer(programConsumer)
 *     .setResourceShrinkerConfiguration(builder -> builder
 *         .enableOptimizedShrinkingWithR8()
 *         .build())
 *     .build();
 * </pre>
 */
@KeepForApi
public class ResourceShrinkerConfiguration {
  public static ResourceShrinkerConfiguration DEFAULT_CONFIGURATION =
      new ResourceShrinkerConfiguration(false, true, null);

  private final boolean optimizedShrinking;
  private final boolean preciseShrinking;
  private final StringConsumer debugConsumer;

  private ResourceShrinkerConfiguration(
      boolean optimizedShrinking, boolean preciseShrinking, StringConsumer debugConsumer) {
    this.optimizedShrinking = optimizedShrinking;
    this.preciseShrinking = preciseShrinking;
    this.debugConsumer = debugConsumer;
  }

  public static Builder builder(DiagnosticsHandler handler) {
    return new Builder();
  }

  public boolean isOptimizedShrinking() {
    return optimizedShrinking;
  }

  public boolean isPreciseShrinking() {
    return preciseShrinking;
  }

  public StringConsumer getDebugConsumer() {
    return debugConsumer;
  }

  /**
   * Builder for constructing a ResourceShrinkerConfiguration.
   *
   * <p>A builder is obtained by calling setResourceShrinkerConfiguration on a {@link
   * R8Command.Builder}.
   */
  @KeepForApi
  public static class Builder {

    private boolean optimizedShrinking = false;
    private boolean preciseShrinking = true;
    private StringConsumer debugConsumer;

    private Builder() {}

    /**
     * Enable R8 based resource shrinking.
     *
     * <p>If this is not set, r8 will use resource shrinking legacy mode where resource shrinking is
     * done after code has been generated. This is consistent with a setup where resource shrinking
     * is run seperately from R8.
     *
     * <p>Setting this option allows R8 to shrink resources as part of its normal compilation,
     * tracing resources throughout the pipeline.
     */
    public Builder enableOptimizedShrinkingWithR8() {
      assert preciseShrinking;
      this.optimizedShrinking = true;
      return this;
    }

    public Builder setDebugConsumer(StringConsumer consumer) {
      this.debugConsumer = consumer;
      return this;
    }

    /**
     * Disable precise shrinking.
     *
     * <p>The resource table will not be rewritten. Unused entries in the res folder will be
     * replaced by small dummy files.
     */
    @Deprecated
    public Builder disablePreciseShrinking() {
      assert !optimizedShrinking;
      this.preciseShrinking = false;
      return this;
    }

    /** Build and return the {@link ResourceShrinkerConfiguration} */
    public ResourceShrinkerConfiguration build() {
      return new ResourceShrinkerConfiguration(optimizedShrinking, preciseShrinking, debugConsumer);
    }
  }
}
