#!/usr/bin/env bash

set -euo pipefail

ROOT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
VERSION="7.1.1"
ARCHIVE="ffmpeg-$VERSION.tar.xz"
ARCHIVE_SHA256="733984395e0dbbe5c046abda2dc49a5544e7e0e1e2366bba849222ae9e3a03b1"
DOWNLOAD_URL="https://ffmpeg.org/releases/$ARCHIVE"
NDK="${ANDROID_NDK_HOME:-$HOME/Library/Android/sdk/ndk/29.0.13113456}"
API="${ANDROID_API_LEVEL:-26}"
WORK_DIR="${FFMPEG_BUILD_DIR:-$ROOT_DIR/.native-build/ffmpeg-$VERSION-lgpl}"
OUTPUT_DIR="$ROOT_DIR/resources/ffmpeg_$VERSION"

TOOLCHAIN_ROOT="$NDK/toolchains/llvm/prebuilt"
HOST_TAG="$(find "$TOOLCHAIN_ROOT" -mindepth 1 -maxdepth 1 -type d -print -quit | xargs basename)"
TOOLCHAIN="$TOOLCHAIN_ROOT/$HOST_TAG"

if [[ ! -x "$TOOLCHAIN/bin/llvm-ar" ]]; then
    echo "Android NDK toolchain not found at $TOOLCHAIN" >&2
    exit 1
fi

mkdir -p "$WORK_DIR/download" "$WORK_DIR/build" "$WORK_DIR/install"
if [[ ! -f "$WORK_DIR/download/$ARCHIVE" ]]; then
    curl -L --fail "$DOWNLOAD_URL" -o "$WORK_DIR/download/$ARCHIVE"
fi

actual_sha="$(shasum -a 256 "$WORK_DIR/download/$ARCHIVE" | awk '{print $1}')"
if [[ "$actual_sha" != "$ARCHIVE_SHA256" ]]; then
    echo "FFmpeg archive checksum mismatch: $actual_sha" >&2
    exit 1
fi

rm -rf "$WORK_DIR/source"
mkdir -p "$WORK_DIR/source"
tar -xf "$WORK_DIR/download/$ARCHIVE" -C "$WORK_DIR/source" --strip-components=1

common_flags=(
    --target-os=android
    --enable-cross-compile
    --disable-static
    --enable-shared
    --enable-avutil
    --enable-avformat
    --enable-avcodec
    --enable-swscale
    --enable-swresample
    --disable-everything
    --disable-autodetect
    --disable-debug
    --disable-doc
    --disable-programs
    --disable-avdevice
    --disable-network
    --enable-pthreads
    --enable-runtime-cpudetect
    --enable-jni
    --enable-zlib
    --enable-protocol=file
    --enable-protocol=pipe
    --enable-muxer=mp4
    --enable-encoder=mpeg4
    --enable-encoder=aac
    --enable-decoder=mpeg4
    --enable-demuxer=aac
    --enable-demuxer=concat
    --enable-demuxer=data
    --enable-demuxer=mov
    --enable-demuxer=mp3
    --enable-demuxer=mpegps
    --enable-demuxer=mpegts
    --enable-demuxer=mpegvideo
    --enable-demuxer=flac
    --enable-demuxer=hevc
    --enable-demuxer=gif
    --enable-demuxer=wav
    --enable-demuxer=ogg
    --enable-decoder=aac
    --enable-decoder=aac_latm
    --enable-decoder=h264
    --enable-decoder=mp3
    --enable-decoder=flac
    --enable-decoder=hevc
    --enable-decoder=vp8
    --enable-decoder=vp9
    --enable-decoder=gif
    --enable-decoder=vorbis
    --enable-decoder=pcm_s16le
    --enable-decoder=pcm_s16be
    --enable-decoder=pcm_u16le
    --enable-decoder=pcm_u16be
    --enable-decoder=pcm_s8
    --enable-decoder=pcm_u8
    --enable-decoder=pcm_mulaw
    --enable-decoder=pcm_alaw
    --enable-parser=aac
    --enable-parser=aac_latm
    --enable-parser=h264
    --enable-parser=flac
    --enable-parser=hevc
    --enable-parser=vorbis
    --enable-parser=gif
    --disable-hwaccels
    --disable-vulkan
    --enable-pic
    --pkg-config=false
    --extra-cflags=-O3\ -fPIC\ -DANDROID
    --extra-ldflags=-Wl,-z,max-page-size=16384
    --extra-libs=-lm\ -ldl
)

build_abi() {
    local abi="$1"
    local arch="$2"
    local target="$3"
    shift 3
    local build_dir="$WORK_DIR/build/$abi"
    local prefix="$WORK_DIR/install/$abi"
    local cc="$TOOLCHAIN/bin/${target}${API}-clang"
    local cxx="$TOOLCHAIN/bin/${target}${API}-clang++"

    rm -rf "$build_dir" "$prefix"
    mkdir -p "$build_dir" "$prefix"
    (
        cd "$build_dir"
        "$WORK_DIR/source/configure" \
            --prefix="$prefix" \
            --arch="$arch" \
            --cc="$cc" \
            --cxx="$cxx" \
            --ar="$TOOLCHAIN/bin/llvm-ar" \
            --strip="$TOOLCHAIN/bin/llvm-strip" \
            --ranlib="$TOOLCHAIN/bin/llvm-ranlib" \
            "${common_flags[@]}" \
            "$@"
        make -j"$(sysctl -n hw.logicalcpu 2>/dev/null || echo 4)"
        make install
    )

    mkdir -p "$OUTPUT_DIR/$abi" "$OUTPUT_DIR/include/$abi"
    for library in avutil avformat avcodec swscale swresample; do
        cp -L "$prefix/lib/lib$library.so" "$OUTPUT_DIR/$abi/lib$library.so"
        "$TOOLCHAIN/bin/llvm-strip" "$OUTPUT_DIR/$abi/lib$library.so"
    done
    for headers in libavutil libavformat libavcodec libswscale libswresample; do
        rm -rf "$OUTPUT_DIR/include/$abi/$headers"
        cp -R "$prefix/include/$headers" "$OUTPUT_DIR/include/$abi/$headers"
    done
}

build_abi arm64-v8a aarch64 aarch64-linux-android --cpu=armv8-a --enable-neon --enable-asm --enable-inline-asm
build_abi armeabi-v7a arm armv7a-linux-androideabi --cpu=armv7-a --enable-thumb --enable-neon --enable-asm --enable-inline-asm
build_abi x86_64 x86_64 x86_64-linux-android --disable-x86asm

cp "$WORK_DIR/source/COPYING.LGPLv2.1" "$OUTPUT_DIR/COPYING.LGPLv2.1"
cp "$WORK_DIR/source/LICENSE.md" "$OUTPUT_DIR/LICENSE.md"
mkdir -p "$ROOT_DIR/momenticCollage/assets/open_source"
cp "$WORK_DIR/source/COPYING.LGPLv2.1" \
    "$ROOT_DIR/momenticCollage/assets/open_source/FFmpeg-LGPL-2.1.txt"

"$ROOT_DIR/scripts/check-ffmpeg-license.sh" "$OUTPUT_DIR"
