# 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)
