# Copyright 2016 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.
"""Common definitions for Apple rules."""

APPLE_SIMULATOR_ARCHITECTURES = ["i386", "x86_64"]
"""Architectures that are used by the simulator (iOS, tvOS and watchOS)."""

IOS_DEVICE_ARCHITECTURES = ["armv7", "arm64"]
"""Architectures that are used by iOS devices."""

TVOS_DEVICE_ARCHITECTURES = ["arm64"]
"""Architectures that are used by tvOS devices."""

WATCHOS_DEVICE_ARCHITECTURES = ["armv7k"]
"""Architectures that are used by watchOS devices."""

APPLE_DEFAULT_ARCHITECTURES = (APPLE_SIMULATOR_ARCHITECTURES +
                               IOS_DEVICE_ARCHITECTURES +
                               WATCHOS_DEVICE_ARCHITECTURES)
"""Architectures commonly used for building/testing on simulators/devices."""

APPLE_FRAGMENTS = ["apple"]
"""Configuration fragments containing Apple specific information."""

DARWIN_EXECUTION_REQUIREMENTS = {"requires-darwin": ""}
"""Standard execution requirements to force building on Mac.

See :func:`apple_action`."""

XCRUNWRAPPER_LABEL = "//external:xcrunwrapper"
"""The label for xcrunwrapper tool."""


def label_scoped_path(ctx, path):
  """Return the path scoped to target's label."""
  return ctx.label.name + "/" + path.lstrip("/")


def module_cache_path(ctx):
  """Returns the Clang module cache path to use for this rule."""
  return ctx.genfiles_dir.path + "/_objc_module_cache"


def apple_action(ctx, **kw):
  """Creates an action that only runs on MacOS/Darwin.

  Call it similar to how you would call ctx.action:
    apple_action(ctx, outputs=[...], inputs=[...],...)
  """
  execution_requirements = dict(kw.get("execution_requirements", {}))
  execution_requirements.update(DARWIN_EXECUTION_REQUIREMENTS)

  no_sandbox = kw.pop("no_sandbox", False)
  if no_sandbox:
    execution_requirements["nosandbox"] = "1"

  kw["execution_requirements"] = execution_requirements

  ctx.action(**kw)


def xcrun_env(ctx):
  """Returns the environment dictionary necessary to use xcrunwrapper."""
  platform = ctx.fragments.apple.single_arch_platform

  if hasattr(apple_common, "apple_host_system_env"):
    xcode_config =  ctx.attr._xcode_config[apple_common.XcodeVersionConfig]
    env = apple_common.target_apple_env(xcode_config, platform)
    env.update(apple_common.apple_host_system_env(xcode_config))
  else:
    env = ctx.fragments.apple.target_apple_env(platform)
    env.update(ctx.fragments.apple.apple_host_system_env())

  return env


def xcrun_action(ctx, **kw):
  """Creates an apple action that executes xcrunwrapper.

  args:
    ctx: The context of the rule that owns this action.

  This method takes the same keyword arguments as ctx.action, however you don't
  need to specify the executable.
  """
  kw["env"] = dict(kw.get("env", {}))
  kw["env"].update(xcrun_env(ctx))

  apple_action(ctx, executable=ctx.executable._xcrunwrapper, **kw)
