#!/usr/bin/env bash
# Rebuilds the "audiotools-legacy" libav.js variant from scratch and copies the
# runtime files into vendor/libav-legacy. Needs: git, make, m4, curl, node, npm,
# pkg-config, python3 and about 3 GB of disk. Takes 20-40 minutes.
set -euo pipefail

LIBAV_TAG="${LIBAV_TAG:-v6.10.9.0}"
LIBAV_VERSION="${LIBAV_TAG#v}"
EMSDK_VERSION="${EMSDK_VERSION:-6.0.11}"
VARIANT="audiotools-legacy"

REPO_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
RECIPE_DIR="$REPO_ROOT/scripts/libav-legacy"
OUT_DIR="$REPO_ROOT/vendor/libav-legacy"
CACHE_DIR="${LIBAV_LEGACY_CACHE:-$HOME/.cache}"
EMSDK_DIR="${EMSDK_DIR:-$CACHE_DIR/emsdk}"
SRC_DIR="${LIBAV_SRC_DIR:-$CACHE_DIR/libav.js-$LIBAV_VERSION}"

FRAGMENTS='[
  "avformat","avcodec","swresample",
  "demuxer-asf","demuxer-amr","demuxer-caf","demuxer-au","demuxer-mp4",
  "demuxer-mp3","demuxer-ogg","demuxer-flac","demuxer-wav","demuxer-aiff",
  "demuxer-webm","demuxer-aac",
  "muxer-asf","muxer-ogg","muxer-amr",
  "parser-aac","parser-mpegaudio","parser-opus","parser-vorbis","parser-flac",
  "decoder-wmav1","decoder-wmav2","decoder-wmapro","decoder-wmalossless",
  "decoder-alac","decoder-amrnb","decoder-amrwb",
  "decoder-aac","decoder-mp3float","decoder-opus","decoder-vorbis","decoder-flac",
  "decoder-pcm_s8","decoder-pcm_u8","decoder-pcm_s16le","decoder-pcm_s16be",
  "decoder-pcm_s24le","decoder-pcm_s24be","decoder-pcm_s32le","decoder-pcm_s32be",
  "decoder-pcm_f32le","decoder-pcm_f32be",
  "decoder-pcm_alaw","decoder-pcm_mulaw","decoder-adpcm_ima_wav","decoder-adpcm_ms",
  "decoder-libopus","decoder-libvorbis",
  "encoder-wmav2","encoder-libopus","encoder-libvorbis",
  "encoder-libopencore_amrnb","encoder-pcm_s16le"
]'

if [ ! -d "$EMSDK_DIR" ]; then
  git clone https://github.com/emscripten-core/emsdk "$EMSDK_DIR"
fi
"$EMSDK_DIR/emsdk" install "$EMSDK_VERSION"
"$EMSDK_DIR/emsdk" activate "$EMSDK_VERSION"
# shellcheck disable=SC1091
source "$EMSDK_DIR/emsdk_env.sh"

if [ ! -d "$SRC_DIR" ]; then
  git clone --branch "$LIBAV_TAG" --depth 1 https://github.com/Yahweasel/libav.js "$SRC_DIR"
fi

cp "$RECIPE_DIR/opencore-amr.mk" "$SRC_DIR/mk/opencore-amr.mk"
mkdir -p "$SRC_DIR/configs/fragments"
cp -r "$RECIPE_DIR/fragments/." "$SRC_DIR/configs/fragments/"

cd "$SRC_DIR/configs"
node mkconfig.js "$VARIANT" "$FRAGMENTS"

cd "$SRC_DIR"
npm ci --ignore-scripts
make -j"$(nproc)" extract
make -j"$(nproc)" \
  "dist/libav-$LIBAV_VERSION-$VARIANT.wasm.mjs" \
  "dist/libav-$LIBAV_VERSION-$VARIANT.mjs" \
  dist/libav.types.d.ts

# Original file names stay, so the glue's own wasm reference resolves in Vite.
rm -rf "$OUT_DIR"
mkdir -p "$OUT_DIR/licenses"
cp "dist/libav-$LIBAV_VERSION-$VARIANT.mjs" \
  "dist/libav-$LIBAV_VERSION-$VARIANT.wasm.mjs" \
  "dist/libav-$LIBAV_VERSION-$VARIANT.wasm.wasm" \
  dist/libav.types.d.ts \
  "$OUT_DIR/"

cp LICENSE.md "$OUT_DIR/licenses/libav.js-LICENSE.md"
cp build/ffmpeg-9.0/COPYING.LGPLv2.1 build/ffmpeg-9.0/COPYING.LGPLv3 "$OUT_DIR/licenses/"
cp build/opencore-amr-*/LICENSE "$OUT_DIR/licenses/opencore-amr-LICENSE"
cp build/libogg-*/COPYING "$OUT_DIR/licenses/libogg-COPYING"
cp build/libvorbis-*/COPYING "$OUT_DIR/licenses/libvorbis-COPYING"
cp build/opus-*/COPYING "$OUT_DIR/licenses/opus-COPYING"
ls -l "$OUT_DIR"
