// Copyright 2018 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.databinding;

import com.google.common.collect.ImmutableList;
import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.analysis.RuleConfiguredTargetBuilder;
import com.google.devtools.build.lib.analysis.RuleContext;
import com.google.devtools.build.lib.rules.android.AndroidDataContext;
import com.google.devtools.build.lib.rules.android.AndroidResources;
import com.google.devtools.build.lib.rules.java.JavaPluginInfo;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

/** Contains Android Databinding configuration and resource generation information. */
public interface DataBindingContext {

  /**
   * Returns the file where data binding's resource processing produces binding xml. For example,
   * given:
   *
   * <pre>{@code
   * <layout>
   *   <data>
   *     <variable name="foo" type="String" />
   *   </data>
   * </layout>
   * <LinearLayout>
   *   ...
   * </LinearLayout>
   * }</pre>
   *
   * <p>data binding strips out and processes this part:
   *
   * <pre>{@code
   * <data>
   *   <variable name="foo" type="String" />
   * </data>
   * }</pre>
   *
   * for each layout file with data binding expressions. Since this may produce multiple files,
   * outputs are zipped up into a single container.
   */
  void supplyLayoutInfo(Consumer<Artifact> consumer);

  /** The javac flags that are needed to configure data binding's annotation processor. */
  void supplyJavaCoptsUsing(
      RuleContext ruleContext,
      boolean isBinary,
      Consumer<Iterable<String>> consumer);

  /**
   * Adds data binding's annotation processor as a plugin to the given Java compilation context.
   *
   * <p>This extends the Java compilation to translate data binding .xml into corresponding classes.
   *
   * <p>The BiConsumer accepts as its first argument the JavaPluginInfoProvider, and the list of
   * outputs of the processor as the second argument.
   */
  void supplyAnnotationProcessor(
      RuleContext ruleContext, BiConsumer<JavaPluginInfo, Iterable<Artifact>> consumer);

  /**
   * Processes deps that also apply data binding.
   *
   * @param ruleContext the current rule
   * @param isBinary whether this rule is a "binary" rule (i.e., top-level android rule)
   * @return the deps' metadata outputs. These need to be staged as compilation inputs to the
   *     current rule.
   */
  ImmutableList<Artifact> processDeps(RuleContext ruleContext, boolean isBinary);

  /**
   * Creates and adds the generated Java source for data binding annotation processor to read and
   * translate layout info xml (from {@link #supplyLayoutInfo(Consumer)} into the classes that end
   * user code consumes.
   *
   * <p>This triggers the annotation processor. Annotation processor settings are configured
   * separately in {@link #supplyJavaCoptsUsing(RuleContext, boolean, Consumer)}.
   */
  ImmutableList<Artifact> getAnnotationSourceFiles(RuleContext ruleContext);

  /**
   * Adds the appropriate {@link UsesDataBindingProvider} for a rule if it should expose one.
   *
   * <p>A rule exposes {@link UsesDataBindingProvider} if either it or its deps set {@code
   * enable_data_binding = 1}.
   */
  void addProvider(RuleConfiguredTargetBuilder builder, RuleContext ruleContext);

  /**
   * Process the given Android Resources for databinding. In databinding v2, this strips out the
   * databinding and generates the layout info file.
   */
  AndroidResources processResources(
      AndroidDataContext dataContext,
      AndroidResources resources,
      String appId);

  /** Returns whether this context supports generating AndroidX dependencies. */
  boolean usesAndroidX();
}
