// Copyright 2015 The Bazel Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//    http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
package com.google.devtools.build.lib.rules.android;

import com.google.common.base.Preconditions;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.cmdline.Label;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.collect.nestedset.NestedSetBuilder;
import com.google.devtools.build.lib.collect.nestedset.Order;
import com.google.devtools.build.lib.concurrent.ThreadSafety.Immutable;
import com.google.devtools.build.lib.packages.BuiltinProvider;
import com.google.devtools.build.lib.packages.NativeInfo;
import com.google.devtools.build.lib.skylarkbuildapi.android.AndroidResourcesInfoApi;
import com.google.devtools.build.lib.syntax.Depset;
import com.google.devtools.build.lib.syntax.EvalException;

/** A provider that supplies ResourceContainers from its transitive closure. */
@Immutable
public class AndroidResourcesInfo extends NativeInfo
    implements AndroidResourcesInfoApi<Artifact, ValidatedAndroidResources, AndroidManifestInfo> {

  public static final String PROVIDER_NAME = "AndroidResourcesInfo";
  public static final Provider PROVIDER = new Provider();

  /*
   * Local information about the target that produced this provider, for tooling. These values will
   * be made available even if they should not be inherited (for example, if this target has
   * "neverlink" set) - do not inherit them directly.
   */

  // Lets us know where the provider came from
  private final Label label;

  // An updated manifest - resource processing sometimes does additional manifest processing
  // TODO(b/30817309): Remove this once resource processing no longer does manifest processing
  private final AndroidManifestInfo manifest;

  // An R.txt file containing a list of all transitive resources this target expected
  private final Artifact rTxt;

  /*
   * Transitive information used for resource processing
   */

  private final NestedSet<ValidatedAndroidResources> transitiveAndroidResources;
  private final NestedSet<ValidatedAndroidResources> directAndroidResources;
  private final NestedSet<Artifact> transitiveResources;
  private final NestedSet<Artifact> transitiveManifests;
  private final NestedSet<Artifact> transitiveAapt2RTxt;
  private final NestedSet<Artifact> transitiveAapt2ValidationArtifacts;
  private final NestedSet<Artifact> transitiveSymbolsBin;
  private final NestedSet<Artifact> transitiveCompiledSymbols;
  private final NestedSet<Artifact> transitiveStaticLib;
  private final NestedSet<Artifact> transitiveRTxt;

  AndroidResourcesInfo(
      Label label,
      AndroidManifestInfo manifest,
      Artifact rTxt,
      NestedSet<ValidatedAndroidResources> transitiveAndroidResources,
      NestedSet<ValidatedAndroidResources> directAndroidResources,
      NestedSet<Artifact> transitiveResources,
      NestedSet<Artifact> transitiveManifests,
      NestedSet<Artifact> transitiveAapt2RTxt,
      NestedSet<Artifact> transitiveAapt2ValidationArtifacts,
      NestedSet<Artifact> transitiveSymbolsBin,
      NestedSet<Artifact> transitiveCompiledSymbols,
      NestedSet<Artifact> transitiveStaticLib,
      NestedSet<Artifact> transitiveRTxt) {
    super(PROVIDER);
    this.label = label;
    this.manifest = manifest;
    this.rTxt = rTxt;
    this.transitiveAndroidResources = transitiveAndroidResources;
    this.directAndroidResources = directAndroidResources;
    this.transitiveResources = transitiveResources;
    this.transitiveManifests = transitiveManifests;
    this.transitiveAapt2RTxt = transitiveAapt2RTxt;
    this.transitiveAapt2ValidationArtifacts = transitiveAapt2ValidationArtifacts;
    this.transitiveSymbolsBin = transitiveSymbolsBin;
    this.transitiveCompiledSymbols = transitiveCompiledSymbols;
    this.transitiveStaticLib = transitiveStaticLib;
    this.transitiveRTxt = transitiveRTxt;
  }

  @Override
  public Label getLabel() {
    return label;
  }

  @Override
  public AndroidManifestInfo getManifest() {
    return manifest;
  }

  @Override
  public Artifact getRTxt() {
    return rTxt;
  }

  @Override
  public Depset /*<ValidatedAndroidResources>*/ getTransitiveAndroidResourcesForStarlark() {
    return Depset.of(ValidatedAndroidResources.class, transitiveAndroidResources);
  }

  public NestedSet<ValidatedAndroidResources> getTransitiveAndroidResources() {
    return transitiveAndroidResources;
  }

  @Override
  public Depset /*<ValidatedAndroidResources>*/ getDirectAndroidResourcesForStarlark() {
    return Depset.of(ValidatedAndroidResources.class, directAndroidResources);
  }

  public NestedSet<ValidatedAndroidResources> getDirectAndroidResources() {
    return directAndroidResources;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveResourcesForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveResources);
  }

  public NestedSet<Artifact> getTransitiveResources() {
    return transitiveResources;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveManifestsForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveManifests);
  }

  public NestedSet<Artifact> getTransitiveManifests() {
    return transitiveManifests;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveAapt2RTxtForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveAapt2RTxt);
  }

  public NestedSet<Artifact> getTransitiveAapt2RTxt() {
    return transitiveAapt2RTxt;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveAapt2ValidationArtifactsForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveAapt2ValidationArtifacts);
  }

  NestedSet<Artifact> getTransitiveAapt2ValidationArtifacts() {
    return transitiveAapt2ValidationArtifacts;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveSymbolsBinForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveSymbolsBin);
  }

  public NestedSet<Artifact> getTransitiveSymbolsBin() {
    return transitiveSymbolsBin;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveCompiledSymbolsForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveCompiledSymbols);
  }

  NestedSet<Artifact> getTransitiveCompiledSymbols() {
    return transitiveCompiledSymbols;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveStaticLibForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveStaticLib);
  }

  NestedSet<Artifact> getTransitiveStaticLib() {
    return transitiveStaticLib;
  }

  @Override
  public Depset /*<Artifact>*/ getTransitiveRTxtForStarlark() {
    return Depset.of(Artifact.TYPE, transitiveRTxt);
  }

  NestedSet<Artifact> getTransitiveRTxt() {
    return transitiveRTxt;
  }

  /** Provider for {@link AndroidResourcesInfo}. */
  public static class Provider extends BuiltinProvider<AndroidResourcesInfo>
      implements AndroidResourcesInfoApi.AndroidResourcesInfoApiProvider<
          Artifact, ValidatedAndroidResources, AndroidManifestInfo> {

    private Provider() {
      super(PROVIDER_NAME, AndroidResourcesInfo.class);
    }

    @Override
    public AndroidResourcesInfo createInfo(
        Label label,
        AndroidManifestInfo manifest,
        Artifact rTxt,
        Depset transitiveAndroidResources,
        Depset directAndroidResources,
        Depset transitiveResources,
        Depset transitiveManifests,
        Depset transitiveAapt2RTxt,
        Depset transitiveSymbolsBin,
        Depset transitiveCompiledSymbols,
        Depset transitiveStaticLib,
        Depset transitiveRTxt,
        Object transitiveAapt2ValidationArtifacts)
        throws EvalException {
      return new AndroidResourcesInfo(
          label,
          manifest,
          rTxt,
          nestedSet(
              transitiveAndroidResources,
              ValidatedAndroidResources.class,
              "transitive_android_resources"),
          nestedSet(
              directAndroidResources, ValidatedAndroidResources.class, "direct_android_resources"),
          nestedSet(transitiveResources, Artifact.class, "transitive_resources"),
          nestedSet(transitiveManifests, Artifact.class, "transitive_manifests"),
          nestedSet(transitiveAapt2RTxt, Artifact.class, "transitive_aapt2_r_txt"),
          nestedSet(transitiveAapt2ValidationArtifacts, Artifact.class, "validation_artifacts"),
          nestedSet(transitiveSymbolsBin, Artifact.class, "transitive_symbols_bin"),
          nestedSet(transitiveCompiledSymbols, Artifact.class, "transitive_compiled_symbols"),
          nestedSet(transitiveStaticLib, Artifact.class, "transitive_static_lib"),
          nestedSet(transitiveRTxt, Artifact.class, "transitive_r_txt"));
    }

    private static <T> NestedSet<T> nestedSet(Depset from, Class<T> with, String fieldName)
        throws EvalException {
      return NestedSetBuilder.<T>stableOrder()
          .addTransitive(from.getSetFromParam(with, fieldName))
          .build();
    }

    private static <T> NestedSet<T> nestedSet(Object from, Class<T> with, String fieldName)
        throws EvalException {
      Preconditions.checkArgument(
          from instanceof Depset || from == com.google.devtools.build.lib.syntax.Starlark.UNBOUND);

      if (from instanceof Depset) {
        return nestedSet((Depset) from, with, fieldName);
      }
      return NestedSetBuilder.emptySet(Order.NAIVE_LINK_ORDER);
    }
  }
}
