// 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.skylarkbuildapi.android;

import com.google.common.collect.ImmutableCollection;
import com.google.common.collect.ImmutableMap;
import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
import com.google.devtools.build.lib.skylarkbuildapi.java.OutputJarApi;
import com.google.devtools.build.lib.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.syntax.Depset;
import com.google.devtools.build.lib.syntax.StarlarkValue;
import javax.annotation.Nullable;

/**
 * A class that exposes the Android providers to Skylark. It is intended to provide a simple and
 * stable interface for Skylark users.
 */
@SkylarkModule(
    name = "AndroidSkylarkApiProvider",
    title = "android",
    category = SkylarkModuleCategory.PROVIDER,
    doc =
        "Do not use this module. It is intended for migration purposes only. If you depend on it, "
            + "you will be broken when it is removed."
            + "Provides access to information about Android rules. Every Android-related target "
            + "provides this struct, accessible as a <code>android</code> field on a "
            + "<a href=\"Target.html\">target</a>.",
    documented = false)
public interface AndroidSkylarkApiProviderApi<FileT extends FileApi> extends StarlarkValue {

  @SkylarkCallable(
      name = "apk",
      structField = true,
      allowReturnNones = true,
      doc = "Returns an APK produced by this target.",
      documented = false)
  @Nullable
  FileT getApk();

  @SkylarkCallable(
      name = "java_package",
      structField = true,
      allowReturnNones = true,
      doc = "Returns a java package for this target.",
      documented = false)
  @Nullable
  String getJavaPackage();

  @SkylarkCallable(
      name = "manifest",
      structField = true,
      allowReturnNones = true,
      doc = "Returns a manifest file for this target.",
      documented = false)
  @Nullable
  FileT getManifest();

  @SkylarkCallable(
      name = "merged_manifest",
      structField = true,
      allowReturnNones = true,
      doc = "Returns a manifest file for this target after all processing, e.g.: merging, etc.",
      documented = false)
  @Nullable
  FileT getMergedManifest();

  @SkylarkCallable(
      name = "native_libs",
      structField = true,
      doc =
          "Returns the native libraries as a dictionary of the libraries' architecture as a string "
              + "to a set of the native library files, or the empty dictionary if there are no "
              + "native libraries.",
      documented = false)
  ImmutableMap<String, Depset> getNativeLibs();

  @SkylarkCallable(
      name = "resource_apk",
      structField = true,
      doc = "Returns the resources container for the target.",
      documented = false,
      allowReturnNones = true)
  @Nullable
  FileT getResourceApk();

  @SkylarkCallable(
      name = "apks_under_test",
      structField = true,
      allowReturnNones = true,
      doc = "Returns a collection of APKs that this target tests.",
      documented = false)
  @Nullable
  ImmutableCollection<FileT> getApksUnderTest();

  @SkylarkCallable(
      name = "defines_resources",
      structField = true,
      doc = "Returns <code>True</code> if the target defines any Android resources directly.",
      documented = false)
  boolean definesAndroidResources();

  @SkylarkCallable(
      name = "idl",
      structField = true,
      doc = "Returns information about IDL files associated with this target.",
      documented = false)
  IdlInfoApi<FileT> getIdlInfo();

  @SkylarkCallable(
      name = "resources",
      structField = true,
      doc = "Returns resources defined by this target.",
      documented = false)
  Depset /*<FileT>*/ getResources();

  @SkylarkCallable(
      name = "resource_jar",
      structField = true,
      allowReturnNones = true,
      doc = "Returns a jar file for classes generated from resources.",
      documented = false)
  @Nullable
  OutputJarApi<FileT> getResourceJar();

  @SkylarkCallable(
      name = "aar",
      structField = true,
      allowReturnNones = true,
      doc = "Returns the aar output of this target.",
      documented = false)
  @Nullable
  FileT getAar();

  /** Helper class to provide information about IDLs related to this rule. */
  @SkylarkModule(
      name = "AndroidSkylarkIdlInfo",
      category = SkylarkModuleCategory.NONE,
      doc =
          "Do not use this module. It is intended for migration purposes only. If you depend on "
              + "it, you will be broken when it is removed."
              + "Provides access to information about Android rules.",
      documented = false)
  interface IdlInfoApi<FileT extends FileApi> extends StarlarkValue {
    @SkylarkCallable(
        name = "import_root",
        structField = true,
        allowReturnNones = true,
        doc = "Returns the root of IDL packages if not the java root.",
        documented = false)
    @Nullable
    String getImportRoot();

    @SkylarkCallable(
        name = "sources",
        structField = true,
        doc = "Returns a list of IDL files.",
        documented = false)
    ImmutableCollection<FileT> getSources();

    @SkylarkCallable(
        name = "generated_java_files",
        structField = true,
        doc = "Returns a list Java files generated from IDL sources.",
        documented = false)
    ImmutableCollection<FileT> getIdlGeneratedJavaFiles();

    @SkylarkCallable(
        name = "output",
        structField = true,
        allowReturnNones = true,
        doc = "Returns a jar file for classes generated from IDL sources.",
        documented = false)
    @Nullable
    OutputJarApi<FileT> getIdlOutput();
  }
}
