// Copyright (c) 2019, 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;
import com.android.tools.r8.utils.FeatureSplitConsumers;
import java.util.ArrayList;
import java.util.List;

/**
 * Immutable structure for specifying input and output of a feature split.
 *
 * <p>A {@link FeatureSplit} can be added to a {@link R8Command} to enable the building of dynamic
 * apps.
 *
 * <p>To build a {@link FeatureSplit} use the {@link FeatureSplit.Builder} class, available through
 * the {@link R8Command.Builder}. For example:
 *
 * <pre>
 *   R8Command command = R8Command.builder()
 *     .addProgramFiles(path1, path2)
 *     .setMode(CompilationMode.RELEASE)
 *     .setProgramConsumer(baseConsumer)
 *     .addFeatureSplit(builder -> builder
 *         .addProgramResourceProvider(programResourceProvider)
 *         .setProgramConsumer(featureConsumer)
 *         .build())
 *     .build();
 * </pre>
 */
@KeepForApi
public class FeatureSplit {

  public static final FeatureSplit BASE =
      new FeatureSplit(null, null, null, null) {
        @Override
        public boolean isBase() {
          return true;
        }
      };

  private ProgramConsumer programConsumer;
  private List<ProgramResourceProvider> programResourceProviders;
  private final AndroidResourceProvider androidResourceProvider;
  private AndroidResourceConsumer androidResourceConsumer;

  private FeatureSplit(
      ProgramConsumer programConsumer,
      List<ProgramResourceProvider> programResourceProviders,
      AndroidResourceProvider androidResourceProvider,
      AndroidResourceConsumer androidResourceConsumer) {
    this.programConsumer = programConsumer;
    this.programResourceProviders = programResourceProviders;
    this.androidResourceProvider = androidResourceProvider;
    this.androidResourceConsumer = androidResourceConsumer;
  }

  void internalSetProgramConsumer(ProgramConsumer consumer) {
    this.programConsumer = consumer;
  }

  void internalSetProgramResourceProviders(List<ProgramResourceProvider> programResourceProviders) {
    this.programResourceProviders = programResourceProviders;
  }

  FeatureSplitConsumers internalClearConsumers() {
    FeatureSplitConsumers consumers =
        new FeatureSplitConsumers(programConsumer, androidResourceConsumer);
    programConsumer = null;
    androidResourceConsumer = null;
    return consumers;
  }

  void internalSetConsumers(FeatureSplitConsumers consumers) {
    programConsumer = consumers.getProgramConsumer();
    androidResourceConsumer = consumers.getAndroidResourceConsumer();
  }

  public boolean isBase() {
    return false;
  }

  public List<ProgramResourceProvider> getProgramResourceProviders() {
    return programResourceProviders;
  }

  public ProgramConsumer getProgramConsumer() {
    return programConsumer;
  }

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

  public AndroidResourceProvider getAndroidResourceProvider() {
    return androidResourceProvider;
  }

  public AndroidResourceConsumer getAndroidResourceConsumer() {
    return androidResourceConsumer;
  }

  /**
   * Builder for constructing a FeatureSplit.
   *
   * <p>A builder is obtained by calling addFeatureSplit on a {@link R8Command.Builder}.
   */
  @KeepForApi
  public static class Builder {
    private ProgramConsumer programConsumer;
    private final List<ProgramResourceProvider> programResourceProviders = new ArrayList<>();
    private AndroidResourceProvider androidResourceProvider;
    private AndroidResourceConsumer androidResourceConsumer;

    @SuppressWarnings("UnusedVariable")
    private final DiagnosticsHandler handler;


    private Builder(DiagnosticsHandler handler) {
      this.handler = handler;
    }

    /**
     * Set the program consumer.
     *
     * <p>Setting the program consumer will override any previous set consumer. This consumer is
     * specific to the feature, i.e., it will only get output from the
     *
     * @param programConsumer Program consumer to set as current.
     */
    public Builder setProgramConsumer(ProgramConsumer programConsumer) {
      this.programConsumer = programConsumer;
      return this;
    }

    /**
     * Add a resource provider for program resources.
     *
     * @param programResourceProvider A provider of program resources.
     */
    public Builder addProgramResourceProvider(ProgramResourceProvider programResourceProvider) {
      this.programResourceProviders.add(programResourceProvider);
      return this;
    }

    public Builder setAndroidResourceProvider(AndroidResourceProvider androidResourceProvider) {
      this.androidResourceProvider = androidResourceProvider;
      return this;
    }

    public Builder setAndroidResourceConsumer(AndroidResourceConsumer androidResourceConsumer) {
      this.androidResourceConsumer = androidResourceConsumer;
      return this;
    }

    /** Build and return the {@link FeatureSplit} */
    public FeatureSplit build() {
      return new FeatureSplit(
          programConsumer,
          programResourceProviders,
          androidResourceProvider,
          androidResourceConsumer);
    }
  }
}
