// 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.apple;

import com.google.devtools.build.lib.collect.nestedset.NestedSet;
import com.google.devtools.build.lib.skylarkbuildapi.FileApi;
import com.google.devtools.build.lib.skylarkbuildapi.StructApi;
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 javax.annotation.Nullable;

/**
 * An interface representing an info type containing information about an Apple dynamic
 * framework.
 **/
@SkylarkModule(
    name = "AppleDynamicFramework",
    category = SkylarkModuleCategory.PROVIDER,
    doc = "A provider containing information about an Apple dynamic framework."
)
public interface AppleDynamicFrameworkInfoApi<PathFragmentT, FileApiT extends FileApi>
    extends StructApi {

  /**
   * Returns the framework path names used as link inputs in order to link against the dynamic
   * framework.
   */
  @SkylarkCallable(name = "framework_dirs",
      structField = true,
      doc = "The framework path names used as link inputs in order to link against the dynamic "
          + "framework."
  )
  public NestedSet<PathFragmentT> getDynamicFrameworkDirs();

  /**
   * Returns the full set of artifacts that should be included as inputs to link against the
   * dynamic framework.
   */
  @SkylarkCallable(name = "framework_files",
      structField = true,
      doc = "The full set of files that should be included as inputs to link against the "
          + "dynamic framework."
  )
  public NestedSet<FileApiT> getDynamicFrameworkFiles();

  /**
   * Returns the multi-architecture dylib binary of the dynamic framework. May return null if
   * the rule providing the framework only specified framework imports.
   */
  @Nullable
  @SkylarkCallable(name = "binary",
      allowReturnNones = true,
      structField = true,
      doc = "The multi-architecture dylib binary of the dynamic framework. May be None if "
          + "the rule providing the framework only specified framework imports."
  )
  public FileApi getAppleDylibBinary();

  /**
   * Returns the {@link ObjcProviderApi} which contains information about the transitive
   * dependencies linked into the dylib.
   */
  @SkylarkCallable(name = "objc",
      structField = true,
      doc = "A provider which contains information about the transitive dependencies linked into "
          + "the dynamic framework."
  )
  public ObjcProviderApi<FileApiT> getDepsObjcProvider();
}
