// Copyright 2017 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.objc;

import com.google.devtools.build.lib.actions.Artifact;
import com.google.devtools.build.lib.collect.nestedset.Depset;
import com.google.devtools.build.lib.collect.nestedset.NestedSet;
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.rules.cpp.CcInfo;
import com.google.devtools.build.lib.starlarkbuildapi.objc.AppleDynamicFrameworkInfoApi;
import javax.annotation.Nullable;

/**
 * Provider containing information about an Apple dynamic framework. This provider contains:
 *
 * <ul>
 *   <li>'framework_dirs': The framework path names used as link inputs in order to link against the
 *       dynamic framework
 *   <li>'framework_files': The full set of artifacts that should be included as inputs to link
 *       against the dynamic framework
 *   <li>'binary': The dylib binary artifact of the dynamic framework
 *   <li>'cc_info': A {@link CcInfo} which contains information about the transitive dependencies
 *       linked into the binary.
 * </ul>
 */
@Immutable
public final class AppleDynamicFrameworkInfo extends NativeInfo
    implements AppleDynamicFrameworkInfoApi<Artifact> {

  /** Starlark name for the AppleDynamicFrameworkInfo. */
  public static final String STARLARK_NAME = "AppleDynamicFramework";

  /** Starlark constructor and identifier for AppleDynamicFrameworkInfo. */
  public static final BuiltinProvider<AppleDynamicFrameworkInfo> STARLARK_CONSTRUCTOR =
      new BuiltinProvider<AppleDynamicFrameworkInfo>(
          STARLARK_NAME, AppleDynamicFrameworkInfo.class) {};

  private final NestedSet<String> dynamicFrameworkDirs;
  private final NestedSet<Artifact> dynamicFrameworkFiles;
  @Nullable private final Artifact dylibBinary;
  private final CcInfo depsCcInfo;

  public AppleDynamicFrameworkInfo(
      @Nullable Artifact dylibBinary,
      CcInfo depsCcInfo,
      NestedSet<String> dynamicFrameworkDirs,
      NestedSet<Artifact> dynamicFrameworkFiles) {
    this.dylibBinary = dylibBinary;
    this.depsCcInfo = depsCcInfo;
    this.dynamicFrameworkDirs = dynamicFrameworkDirs;
    this.dynamicFrameworkFiles = dynamicFrameworkFiles;
  }

  @Override
  public BuiltinProvider<AppleDynamicFrameworkInfo> getProvider() {
    return STARLARK_CONSTRUCTOR;
  }

  @Override
  public Depset /*<String>*/ getDynamicFrameworkDirs() {
    return Depset.of(String.class, dynamicFrameworkDirs);
  }

  @Override
  public Depset /*<Artifact>*/ getDynamicFrameworkFiles() {
    return Depset.of(Artifact.class, dynamicFrameworkFiles);
  }

  @Override
  public Artifact getAppleDylibBinary() {
    return dylibBinary;
  }

  @Override
  public CcInfo getDepsCcInfo() {
    return depsCcInfo;
  }
}
