#!/usr/bin/env bash
# Rebuild the Mediabunny AAC encoder WASM from the pinned sources in this directory.
# Flags match mediabunny v1.51.0 packages/aac-encoder/README.md.
set -euo pipefail

ROOT="$(cd "$(dirname "$0")" && pwd)"
FFMPEG_TAR="$ROOT/ffmpeg-7.1.1.tar.xz"
FFMPEG_SHA_FILE="$ROOT/ffmpeg-7.1.1.tar.xz.sha256"
BRIDGE_SRC="$ROOT/mediabunny-aac-encoder-v1.51.0/src/bridge.c"
WORK="${MEDIABUNNY_AAC_BUILD_DIR:-$ROOT/build-work}"
OUT="${MEDIABUNNY_AAC_OUT_DIR:-$ROOT/build-out}"

need() {
  command -v "$1" >/dev/null 2>&1 || {
    echo "error: required tool not found: $1" >&2
    exit 1
  }
}

need tar
need emconfigure
need emmake
need emcc

if [[ ! -f "$FFMPEG_TAR" ]]; then
  echo "error: missing $FFMPEG_TAR" >&2
  exit 1
fi
if [[ ! -f "$BRIDGE_SRC" ]]; then
  echo "error: missing $BRIDGE_SRC" >&2
  exit 1
fi

if [[ -f "$FFMPEG_SHA_FILE" ]]; then
  EXPECTED="$(awk '{print $1}' "$FFMPEG_SHA_FILE")"
  ACTUAL="$(shasum -a 256 "$FFMPEG_TAR" | awk '{print $1}')"
  if [[ "$EXPECTED" != "$ACTUAL" ]]; then
    echo "error: SHA-256 mismatch for ffmpeg-7.1.1.tar.xz" >&2
    echo "  expected: $EXPECTED" >&2
    echo "  actual:   $ACTUAL" >&2
    exit 1
  fi
fi

rm -rf "$WORK" "$OUT"
mkdir -p "$WORK" "$OUT"

echo "==> Extracting FFmpeg 7.1.1"
tar -xJf "$FFMPEG_TAR" -C "$WORK"
FFMPEG_PATH="$WORK/ffmpeg-7.1.1"

echo "==> Configuring FFmpeg (AAC encoder only, LGPL)"
cd "$FFMPEG_PATH"
emmake make distclean >/dev/null 2>&1 || true
emconfigure ./configure \
  --target-os=none \
  --arch=x86_32 \
  --enable-cross-compile \
  --disable-asm \
  --disable-x86asm \
  --disable-inline-asm \
  --disable-programs \
  --disable-doc \
  --disable-debug \
  --disable-all \
  --disable-everything \
  --disable-autodetect \
  --disable-pthreads \
  --disable-runtime-cpudetect \
  --enable-avcodec \
  --enable-encoder=aac \
  --cc="emcc" \
  --cxx=em++ \
  --ar=emar \
  --ranlib=emranlib \
  --extra-cflags="-DNDEBUG -Oz -flto -msimd128" \
  --extra-ldflags="-Oz -flto"

echo "==> Building FFmpeg"
emmake make -j"${JOBS:-$(sysctl -n hw.ncpu 2>/dev/null || nproc || echo 2)}"

echo "==> Linking Mediabunny AAC bridge"
emcc "$BRIDGE_SRC" \
  "$FFMPEG_PATH/libavcodec/libavcodec.a" \
  "$FFMPEG_PATH/libavutil/libavutil.a" \
  -I"$FFMPEG_PATH" \
  -s MODULARIZE=1 \
  -s EXPORT_ES6=1 \
  -s SINGLE_FILE=1 \
  -s ALLOW_MEMORY_GROWTH=1 \
  -s ENVIRONMENT=web,worker \
  -s FILESYSTEM=0 \
  -s MALLOC=emmalloc \
  -s SUPPORT_LONGJMP=0 \
  -s EXPORTED_RUNTIME_METHODS=cwrap,HEAPU8 \
  -s EXPORTED_FUNCTIONS=_malloc,_free \
  -msimd128 \
  -flto \
  -Oz \
  -o "$OUT/aac.js"

echo "==> Done: $OUT/aac.js"
echo "    (ES module with inlined WASM; same layout as Mediabunny packages/aac-encoder/build/aac.js)"
