
headers = [
    "vp8.h",
    "vp8cx.h",
    "vp8dx.h",
    "vpx_codec.h",
    "vpx_decoder.h",
    "vpx_encoder.h",
    "vpx_frame_buffer.h",
    "vpx_image.h",
    "vpx_integer.h",
    "vpx_version.h",
    "vpx_ext_ratectrl.h",
    "vpx_tpl.h",
]

libs = [
    "VPX",
]

filegroup(
    name = "libvpx_sources",
    srcs = glob([
        "libvpx/**/*"
    ]),
)


genrule(
    name = "libvpx_build",
    srcs = [
        "build-libvpx-bazel.sh",
        "0001-Support-arm64-simulator.patch",
        ":libvpx_sources",
    ],
    cmd_bash = 
    """
    set -ex

    if [ "$(TARGET_CPU)" == "ios_armv7" ]; then
        BUILD_ARCH="armv7"
        PLATFORM_HEADER_DIR="armv7-darwin-gcc"
    elif [ "$(TARGET_CPU)" == "ios_arm64" ]; then
        BUILD_ARCH="arm64"
        PLATFORM_HEADER_DIR="arm64-darwin-gcc"
    elif [ "$(TARGET_CPU)" == "ios_sim_arm64" ]; then
        BUILD_ARCH="sim_arm64"
        PLATFORM_HEADER_DIR="arm64-iphonesimulator-gcc"
    elif [ "$(TARGET_CPU)" == "ios_x86_64" ]; then
        BUILD_ARCH="x86_64"
        PLATFORM_HEADER_DIR="x86_64-iphonesimulator-gcc"
    else
        echo "Unsupported architecture $(TARGET_CPU)"
    fi

    BUILD_DIR="$(RULEDIR)/build_$${BUILD_ARCH}"
    rm -rf "$$BUILD_DIR"
    mkdir -p "$$BUILD_DIR"

    YASM_DIR="$$BUILD_DIR/yasm"
    rm -rf "$$YASM_DIR"
    mkdir -p "$$YASM_DIR"
    tar -xf "$(location //third-party/yasm:yasm.tar)" -C "$$YASM_DIR"
    ABS_YASM_DIR="$$(pwd)/$$(dirname $$YASM_DIR)/$$(basename $$YASM_DIR)"

    cp $(location :build-libvpx-bazel.sh) "$$BUILD_DIR/"
    cp $(location :0001-Support-arm64-simulator.patch) "$$BUILD_DIR/"

    SOURCE_PATH="third-party/libvpx/libvpx"

    cp -R "$$SOURCE_PATH" "$$BUILD_DIR/"

    pushd "$$BUILD_DIR/libvpx"
    patch -p1 < ../0001-Support-arm64-simulator.patch
    popd

    mkdir -p "$$BUILD_DIR/Public/libvpx"

    PATH="$$PATH:$$ABS_YASM_DIR" sh $$BUILD_DIR/build-libvpx-bazel.sh $$BUILD_ARCH "$$BUILD_DIR/libvpx" "$$BUILD_DIR"
    """ +
    "\n".join([
        "cp -f \"$$BUILD_DIR/VPX.framework/Headers/vpx/{}\" \"$(location Public/vpx/{})\"".format(header, header) for header in headers
    ]) +
    "\n" +
    "\n".join([
        "cp -f \"$$BUILD_DIR/VPX.framework/{}\" \"$(location Public/vpx/lib{}.a)\"".format(lib, lib) for lib in libs
    ]) +
    "\n" + "cp -f \"$$BUILD_DIR/VPX.framework/Headers/vpx/$$PLATFORM_HEADER_DIR/vpx_config.h\" \"$(location Public/vpx/vpx_config.h)\"",
    outs = ["Public/vpx/" + x for x in headers] +
    ["Public/vpx/vpx_config.h"] +
    ["Public/vpx/lib{}.a".format(x) for x in libs],
    tools = [
        "//third-party/yasm:yasm.tar",
    ],
    visibility = [
        "//visibility:public",
    ]
)

cc_library(
    name = "libvpx_lib",
    srcs = [":Public/vpx/lib" + x + ".a" for x in libs],
)

objc_library(
    name = "vpx",
    module_name = "vpx",
    enable_modules = True,
    hdrs = [":Public/vpx/" + x for x in headers],
    includes = [
        "Public",
    ],
    deps = [
        ":libvpx_lib",
    ],
    visibility = [
        "//visibility:public",
    ],
)
