# Copyright 2023 The MediaPipe 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.

load(
    "//mediapipe/tasks/ios:ios.bzl",
    "MPP_TASK_MINIMUM_OS_VERSION",
    "strip_api_include_path_prefix",
)
load(
    "@build_bazel_rules_apple//apple:apple.bzl",
    "apple_static_xcframework",
    "apple_static_library",
)

package(default_visibility = ["//visibility:public"])

licenses(["notice"])

# list of targets to be added in avoid_deps of ":MediaPipeTaskVision_framework"
# and ":MediaPipeTaskText_framework". 
# The transitive closure of the following targets are used for building the 
# frameworks but are avoided from the framework binaries to avoid duplicate symbols
# error when included in an xcode project:
# 1. iOS classes shared amongst the various vision and text tasks. These classes
# will be built with ":MediaPipeTaskCommonObjects_framework"
# 2. Task graphs. These will be built with ":MediaPipeTaskGraphs_library".
# 3. gpu targets which will be built with the ":MediaPipeTaskGraphs_library".
OBJC_COMMON_DEPS = [
    "//mediapipe/tasks/ios/core:MPPBaseOptions",
    "//mediapipe/tasks/ios/core:MPPTaskInfo",
    "//mediapipe/tasks/ios/core:MPPTaskOptions",
    "//mediapipe/tasks/ios/core:MPPTaskResult",
    "//mediapipe/tasks/ios/core:MPPTaskRunner",
    "//mediapipe/tasks/ios/components/containers:MPPClassificationResult",
    "//mediapipe/tasks/ios/components/containers:MPPCategory",
    "//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
    "//mediapipe/tasks/cc/vision/image_classifier:image_classifier_graph",
    "//mediapipe/tasks/cc/vision/object_detector:object_detector_graph",
    "//mediapipe/tasks/cc/text/text_classifier:text_classifier_graph",
    "//mediapipe/tasks/cc/text/text_embedder:text_embedder_graph",
    "//mediapipe/gpu:metal_shared_resources",
]

strip_api_include_path_prefix(
    name = "strip_api_include_path",
    hdr_labels = [
        "//mediapipe/tasks/ios/common:sources/MPPCommon.h",
        "//mediapipe/tasks/ios/components/containers:sources/MPPCategory.h",
        "//mediapipe/tasks/ios/components/containers:sources/MPPClassificationResult.h",
        "//mediapipe/tasks/ios/components/containers:sources/MPPEmbedding.h",
        "//mediapipe/tasks/ios/components/containers:sources/MPPEmbeddingResult.h",
        "//mediapipe/tasks/ios/core:sources/MPPBaseOptions.h",
        "//mediapipe/tasks/ios/core:sources/MPPTaskOptions.h",
        "//mediapipe/tasks/ios/core:sources/MPPTaskResult.h",
        "//mediapipe/tasks/ios/text/text_classifier:sources/MPPTextClassifier.h",
        "//mediapipe/tasks/ios/text/text_classifier:sources/MPPTextClassifierOptions.h",
        "//mediapipe/tasks/ios/text/text_classifier:sources/MPPTextClassifierResult.h",
        "//mediapipe/tasks/ios/text/text_embedder:sources/MPPTextEmbedder.h",
        "//mediapipe/tasks/ios/text/text_embedder:sources/MPPTextEmbedderOptions.h",
        "//mediapipe/tasks/ios/text/text_embedder:sources/MPPTextEmbedderResult.h",
    ],
)

apple_static_xcframework(
    name = "MediaPipeTaskText_framework",
    public_hdrs = [
        ":MPPBaseOptions.h",
        ":MPPCategory.h",
        ":MPPClassificationResult.h",
        ":MPPEmbedding.h",
        ":MPPEmbeddingResult.h",
        ":MPPCommon.h",
        ":MPPTaskOptions.h",
        ":MPPTaskResult.h",
        ":MPPTextClassifier.h",
        ":MPPTextClassifierOptions.h",
        ":MPPTextClassifierResult.h",
        ":MPPTextEmbedder.h",
        ":MPPTextEmbedderOptions.h",
        ":MPPTextEmbedderResult.h",
    ],
    bundle_name = "MediaPipeTaskText",
    ios = {
        "simulator" : ["arm64", "x86_64"],
        "device" : ["arm64"],
    },
    minimum_os_versions = {
        "ios": MPP_TASK_MINIMUM_OS_VERSION,
    },
    deps = [
        "//mediapipe/tasks/ios/text/text_classifier:MPPTextClassifier",
        "//mediapipe/tasks/ios/text/text_embedder:MPPTextEmbedder",
    ],
    # avoid dependencies of ":MediaPipeCommonObjects_framework" and 
    # ":MediaPipeTaskGraphs_library in order to prevent duplicate symbols error 
    # when the frameworks are imported in iOS projects.
    avoid_deps = OBJC_COMMON_DEPS
)

apple_static_xcframework(
    name = "MediaPipeTaskVision_framework",
    public_hdrs = [
        ":MPPBaseOptions.h",
        ":MPPCategory.h",
        ":MPPClassificationResult.h",
        ":MPPDetection.h",
        ":MPPCommon.h",
        ":MPPTaskOptions.h",
        ":MPPTaskResult.h",
        ":MPPImage.h",
        ":MPPRunningMode.h",
        ":MPPImageClassifier.h",
        ":MPPImageClassifierOptions.h",
        ":MPPImageClassifierResult.h",
        ":MPPObjectDetector.h",
        ":MPPObjectDetectorOptions.h",
        ":MPPObjectDetectionResult.h",
    ],
    bundle_name = "MediaPipeTaskVision",
    ios = {
        "simulator" : ["arm64", "x86_64"],
        "device" : ["arm64"],
    },
    minimum_os_versions = {
        "ios": MPP_TASK_MINIMUM_OS_VERSION,
    },
    deps = [
        "//mediapipe/tasks/ios/vision/image_classifier:MPPImageClassifier",
        "//mediapipe/tasks/ios/vision/object_detector:MPPObjectDetector",
    ],
    # Avoids dependencies of ":MediaPipeCommonObjects_framework" and 
    # ":MediaPipeTaskGraphs_library in order to prevent duplicate symbols error 
    # when the frameworks are imported in iOS projects.
    # Also avoids opencv since it will be built with 
    # ":MediaPipeTaskGraphs_library".
    avoid_deps = OBJC_COMMON_DEPS + [
        "@ios_opencv//:OpencvFramework"
    ],
)

apple_static_library(
    name = "MediaPipeTaskGraphs_library",
    minimum_os_version = MPP_TASK_MINIMUM_OS_VERSION,
    platform_type = "ios",
    minimum_os_version =  MPP_TASK_MINIMUM_OS_VERSION,
    deps = [
        "//mediapipe/tasks/cc/vision/image_classifier:image_classifier_graph",
        "//mediapipe/tasks/cc/vision/object_detector:object_detector_graph",
        "//mediapipe/tasks/cc/text/text_classifier:text_classifier_graph",
        "//mediapipe/tasks/cc/text/text_embedder:text_embedder_graph",
        "@org_tensorflow//third_party/icu/data:conversion_data",
        "@ios_opencv//:OpencvFramework"
    ],
    # There is no way to turn off zlib dependency in custom opencv builds. 
    # Hence zlib is avoided to prevent duplicate symbols because of conflicts
    # between opencv's zlib and "@zlib//:zlib"
    avoid_deps = [
        "@zlib//:zlib",
    ],
)

apple_static_xcframework(
    name = "MediaPipeTaskCommonObjects_framework",
    bundle_name = "MediaPipeTaskCommon",
    ios = {
        "simulator" : ["arm64", "x86_64"],
        "device" : ["arm64"],
    },
    minimum_os_versions = {
        "ios": MPP_TASK_MINIMUM_OS_VERSION,
    },
    # avoids gpu targets since they will be built with 
    # ":MediaPipeTaskGraphs_library". Otherwise it will result in
    # duplicate symbols error when the frameworks are imported in iOS.
    avoid_deps = [
        "//mediapipe/gpu:metal_shared_resources",
    ],
    deps = [
        "//mediapipe/tasks/ios/core:MPPBaseOptions",
        "//mediapipe/tasks/ios/core:MPPTaskInfo",
        "//mediapipe/tasks/ios/core:MPPTaskOptions",
        "//mediapipe/tasks/ios/core:MPPTaskResult",
        "//mediapipe/tasks/ios/core:MPPTaskRunner",
        "//mediapipe/tasks/ios/components/containers:MPPClassificationResult",
        "//mediapipe/tasks/ios/components/containers:MPPCategory",
        "//mediapipe/tasks/ios/common/utils:MPPCommonUtils",
    ],
)
