// 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.skylarkinterface.SkylarkCallable;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModule;
import com.google.devtools.build.lib.skylarkinterface.SkylarkModuleCategory;
import com.google.devtools.build.lib.skylarkinterface.SkylarkValue;

/** An interface for an object representing an Apple platform. */
@SkylarkModule(
    name = "apple_platform",
    category = SkylarkModuleCategory.NONE,
    doc = "Corresponds to Xcode's notion of a platform as would be found in "
        + "<code>Xcode.app/Contents/Developer/Platforms</code>. Each platform represents an Apple "
        + "platform type (such as iOS or tvOS) combined with one or more related CPU "
        + "architectures. For example, the iOS simulator platform supports <code>x86_64</code> and "
        + "<code>i386</code> architectures.<p>"
        + "Specific instances of this type can be retrieved from the fields of the "
        + "<a href='apple_common.html#platform'>apple_common.platform</a> struct:<br><ul>"
        + "<li><code>apple_common.platform.ios_device</code></li>"
        + "<li><code>apple_common.platform.ios_simulator</code></li>"
        + "<li><code>apple_common.platform.macos</code></li>"
        + "<li><code>apple_common.platform.tvos_device</code></li>"
        + "<li><code>apple_common.platform.tvos_simulator</code></li>"
        + "<li><code>apple_common.platform.watchos_device</code></li>"
        + "<li><code>apple_common.platform.watchos_simulator</code></li>"
        + "</ul><p>"
        + "More commonly, however, the <a href='apple.html'>apple</a> configuration fragment has "
        + "fields/methods that allow rules to determine the platform for which a target is being "
        + "built.<p>"
        + "Example:<br>"
        + "<pre class='language-python'>\n"
        + "p = apple_common.platform.ios_device\n"
        + "print(p.name_in_plist)  # 'iPhoneOS'\n"
        + "</pre>"
)
public interface ApplePlatformApi extends SkylarkValue {

  /** Returns the platform type of this platform. */
  @SkylarkCallable(
      name = "platform_type",
      doc = "Returns the platform type of this platform.",
      structField = true
  )
  public ApplePlatformTypeApi getType();

  /**
   * Returns true if this platform is a device platform, or false if this is a simulator platform.
   */
  @SkylarkCallable(
      name = "is_device",
      doc = "Returns <code>True</code> if this platform is a device platform or <code>False</code> "
          + "if it is a simulator platform.",
      structField = true
  )
  public boolean isDevice();

  /**
   * Returns the name of the "platform" as it appears in the CFBundleSupportedPlatforms plist
   * setting.
   */
  @SkylarkCallable(name = "name_in_plist", structField = true,
      doc = "The name of the platform as it appears in the <code>CFBundleSupportedPlatforms</code> "
          + "entry of an Info.plist file and in Xcode's platforms directory, without the extension "
          + "(for example, <code>iPhoneOS</code> or <code>iPhoneSimulator</code>).<br>"
          + "This name, when converted to lowercase (e.g., <code>iphoneos</code>, "
          + "<code>iphonesimulator</code>), can be passed to Xcode's command-line tools like "
          + "<code>ibtool</code> and <code>actool</code> when they expect a platform name.")
  public String getNameInPlist();
}
