#!/usr/bin/env bash
set -euo pipefail

repo_root="$(cd "$(dirname "$0")/.." && pwd)"
work_root="${MPVKIT_DYNAMIC_WORK_ROOT:-$repo_root/.derived/mpvkit-dynamic}"
source_root="$work_root/MPVKit"
artifact_root="$repo_root/MPVKitDynamicPackage/Artifacts"
materials_root="$repo_root/MPVKitDynamic/Materials"
config_root="$materials_root/config"
licenses_root="$materials_root/licenses"
patch_path="$repo_root/MPVKitDynamic/patches/0001-build-lgpl-dynamic-xcframework.patch"
mpv_audio_patch_path="$repo_root/MPVKitDynamic/patches/0002-tvos-audiounit-stereo-layout-fallback.patch"
checksum_verifier="$repo_root/MPVKitDynamic/verify-checksums.sh"
upstream_url="https://github.com/mpvkit/MPVKit.git"
upstream_tag="0.41.0"
upstream_commit="613c0ccc3acf70e136aaff880a9b5fe8fdfaf5b8"

for tool in git swift xcodebuild plutil jq shasum ditto rg cmp; do
    if ! command -v "$tool" >/dev/null; then
        echo "missing required tool: $tool" >&2
        exit 1
    fi
done

mkdir -p "$work_root" "$artifact_root" "$materials_root" "$config_root" "$licenses_root"
if [[ ! -d "$source_root/.git" ]]; then
    git clone --recursive --depth 1 --branch "$upstream_tag" "$upstream_url" "$source_root"
fi

actual_commit="$(git -C "$source_root" rev-parse HEAD)"
if [[ "$actual_commit" != "$upstream_commit" ]]; then
    echo "unexpected MPVKit commit: $actual_commit" >&2
    exit 1
fi

main_swift="$source_root/Sources/BuildScripts/XCFrameworkBuild/main.swift"
normalized_main_swift="$work_root/main.swift.normalized"
sed 's/[[:blank:]]*$//' "$main_swift" >"$normalized_main_swift"
if cmp -s "$main_swift" "$normalized_main_swift"; then
    rm "$normalized_main_swift"
else
    mv "$normalized_main_swift" "$main_swift"
fi

if git -C "$source_root" apply --check "$patch_path" 2>/dev/null; then
    git -C "$source_root" apply "$patch_path"
elif git -C "$source_root" apply --reverse --check "$patch_path" 2>/dev/null; then
    :
else
    echo "MPVKit source tree does not match the pinned patch" >&2
    exit 1
fi

mpv_build_patch="$source_root/Sources/BuildScripts/patch/libmpv/0003-tvos-audiounit-stereo-layout-fallback.patch"
cp "$mpv_audio_patch_path" "$mpv_build_patch"
mpv_source_root="$source_root/dist/libmpv-v0.41.0"
if [[ -d "$mpv_source_root/.git" ]]; then
    if git -C "$mpv_source_root" apply --check "$mpv_audio_patch_path" 2>/dev/null; then
        git -C "$mpv_source_root" apply "$mpv_audio_patch_path"
    elif git -C "$mpv_source_root" apply --reverse --check "$mpv_audio_patch_path" 2>/dev/null; then
        :
    else
        echo "mpv source tree does not match the pinned AudioUnit patch" >&2
        exit 1
    fi
fi

(
    cd "$source_root"
    swift run \
        --build-path .build-conflux-dynamic \
        --package-path Sources/BuildScripts \
        build \
        platform=macos,ios,tvos \
        enable-dynamic \
        enable-arm64-only \
        version="$upstream_tag"
)

frameworks=(
    Libmpv
    Libavcodec
    Libavdevice
    Libavfilter
    Libavformat
    Libavutil
    Libswresample
    Libswscale
)

artifact_checksums="$materials_root/artifact-checksums.sha256"
: >"$artifact_checksums"
for framework in "${frameworks[@]}"; do
    zip_path="$source_root/dist/release/$framework.xcframework.zip"
    if [[ ! -f "$zip_path" ]]; then
        echo "missing official build output: $zip_path" >&2
        exit 1
    fi

    destination="$artifact_root/$framework.xcframework"
    staging="$work_root/extract-$framework"
    rm -rf "$destination" "$staging"
    mkdir -p "$staging"
    ditto -x -k "$zip_path" "$staging"
    mv "$staging/$framework.xcframework" "$destination"
    rmdir "$staging"
    shasum -a 256 "$zip_path" | sed "s#  .*/#  #" >>"$artifact_checksums"
done

input_checksums="$materials_root/upstream-input-checksums.sha256"
actual_input_checksums="$work_root/upstream-input-checksums.actual.sha256"
: >"$actual_input_checksums"
while IFS= read -r archive; do
    relative="${archive#"$source_root/"}"
    digest="$(shasum -a 256 "$archive" | awk '{print $1}')"
    printf '%s  %s\n' "$digest" "$relative" >>"$actual_input_checksums"
done < <(find "$source_root/dist" -type f -name '*.zip' ! -path '*/release/*' | sort)
"$checksum_verifier" "$input_checksums" "$actual_input_checksums"

{
    printf 'MPVKit=%s@%s\n' "$upstream_tag" "$upstream_commit"
    printf 'mpv=%s@%s\n' "v0.41.0" "$(git -C "$source_root/dist/libmpv-v0.41.0" rev-parse HEAD)"
    printf 'FFmpeg=%s@%s\n' "n8.0.1" "$(git -C "$source_root/dist/FFmpeg-n8.0.1" rev-parse HEAD)"
    printf 'patch_sha256=%s\n' "$(shasum -a 256 "$patch_path" | awk '{print $1}')"
    printf 'mpv_audio_patch_sha256=%s\n' "$(shasum -a 256 "$mpv_audio_patch_path" | awk '{print $1}')"
    printf 'swift=%s\n' "$(swift --version | head -n 1)"
    printf 'xcode=%s\n' "$(xcodebuild -version | paste -sd ' ' -)"
} >"$materials_root/build-versions.txt"

platform_arches=(
    macos:arm64
    macos:x86_64
    ios:arm64
    isimulator:arm64
    tvos:arm64
    tvsimulator:arm64
)

for platform_arch in "${platform_arches[@]}"; do
    platform="${platform_arch%%:*}"
    arch="${platform_arch##*:}"
    suffix="$platform"
    if [[ "$platform" == "macos" ]]; then
        suffix="$platform-$arch"
    fi

    ffmpeg_config="$source_root/dist/FFmpeg/$platform/scratch/$arch/config.h"
    ffmpeg_components="$source_root/dist/FFmpeg/$platform/scratch/$arch/config_components.h"
    mpv_options="$source_root/dist/libmpv/$platform/scratch/$arch/meson-info/intro-buildoptions.json"
    cp "$ffmpeg_config" "$config_root/ffmpeg-$suffix.h"
    rg '^#define CONFIG_AAC.*_DECODER 1$' "$ffmpeg_components" \
        >"$config_root/ffmpeg-$suffix-aac-decoders.h"
    cp "$mpv_options" "$config_root/mpv-$suffix-build-options.json"
    rg -q '^#define CONFIG_GPL 0$' "$ffmpeg_config"
    rg -q '^#define CONFIG_NONFREE 0$' "$ffmpeg_config"
    rg -q '^#define CONFIG_AAC_DECODER 1$' "$ffmpeg_components"
    jq -e '.[] | select(.name == "gpl") | .value == false' "$mpv_options" >/dev/null
done

cp "$source_root/LICENSE" "$licenses_root/MPVKit-LGPL-3.0.txt"
cp "$source_root/dist/libmpv-v0.41.0/LICENSE.LGPL" "$licenses_root/mpv-LGPL-2.1-or-later.txt"
cp "$source_root/dist/FFmpeg-n8.0.1/COPYING.LGPLv3" "$licenses_root/FFmpeg-LGPL-3.0.txt"

echo "MPVKit dynamic artifacts are ready in $artifact_root"
