// 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.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.OutputGroupProvider;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.analysis.actions.SpawnAction;
import com.google.devtools.build.lib.packages.RuleClass.ConfiguredTargetFactory.RuleErrorException;
import com.google.devtools.build.lib.rules.java.JavaCommon;
import com.google.devtools.build.lib.rules.java.JavaCompilationArtifacts;
import com.google.devtools.build.lib.rules.java.JavaSemantics;
import com.google.devtools.build.lib.rules.java.JavaTargetAttributes;

import javax.annotation.Nullable;

/**
 * Pluggable semantics for Android rules.
 *
 * <p>A new instance of this class is created for each configured target, therefore, it is allowed
 * to keep state.
 */
public interface AndroidSemantics {
  /**
   * Name of the output group used for idl jars (the jars containing the class files for sources
   * generated from annotation processors).
   */
  String IDL_JARS_OUTPUT_GROUP =
      OutputGroupProvider.HIDDEN_OUTPUT_GROUP_PREFIX + "idl_jars";

  /**
   * Adds transitive info providers for {@code android_binary} and {@code android_library} rules.
   * @throws InterruptedException
   */
  void addTransitiveInfoProviders(
      RuleConfiguredTargetBuilder builder,
      RuleContext ruleContext,
      JavaCommon javaCommon,
      AndroidCommon androidCommon,
      Artifact jarWithAllClasses)
      throws InterruptedException;

  /**
   * Add additional resources to IDE info for {@code android_binary} and {@code android_library}
   *
   * @param ruleContext rule context for target rule
   * @param resourceApk resource apk directly provided by the rule
   * @param ideInfoProviderBuilder
   */
  void addNonLocalResources(
      RuleContext ruleContext,
      @Nullable ResourceApk resourceApk,
      AndroidIdeInfoProvider.Builder ideInfoProviderBuilder);

  /**
   * Returns the manifest to be used when compiling a given rule.
   * @throws InterruptedException 
   */
  ApplicationManifest getManifestForRule(RuleContext ruleContext)
      throws InterruptedException, RuleErrorException;

  /**
   * Returns the name of the file in which the file names of native dependencies are listed.
   */
  String getNativeDepsFileName();

  /**
   * Returns the command line options to be used when compiling Java code for {@code android_*}
   * rules.
   *
   * <p>These will come after the default options specified by the toolchain and the ones in the
   * {@code javacopts} attribute.
   */
  ImmutableList<String> getJavacArguments(RuleContext ruleContext);

  /**
   * JVM arguments to be passed to the command line of dx.
   */
  ImmutableList<String> getDxJvmArguments();

  /**
   * Configures the builder for generating the output jar used to configure the main dex file.
   * @throws InterruptedException
   */
  void addMainDexListActionArguments(RuleContext ruleContext, SpawnAction.Builder builder)
      throws InterruptedException;

  /**
   * Returns the artifact for the debug key for signing the APK.
   */
  Artifact getApkDebugSigningKey(RuleContext ruleContext);
  
  /**
   * Add coverage instrumentation to the Java compilation of an Android binary.
   * @throws InterruptedException 
   */
  void addCoverageSupport(RuleContext ruleContext, AndroidCommon common,
      JavaSemantics javaSemantics, boolean forAndroidTest, JavaTargetAttributes.Builder attributes,
      JavaCompilationArtifacts.Builder artifactsBuilder) throws InterruptedException;
}
