#!/usr/bin/env bash
# Compila el ffmpeg que viaja con Decibel, para macOS Apple Silicon (nativo) y
# para Windows x86_64 (cruzado con mingw-w64), del MISMO tarball oficial y con la
# MISMA lista de componentes: los dos analizan igual.
#
#     bash scripts/build-ffmpeg.sh <carpeta de salida>
#
# Deja en la carpeta:
#   ffmpeg-<versión>-aarch64-apple-darwin
#   ffmpeg-<versión>-x86_64-pc-windows-msvc.exe
#   ffmpeg-<versión>.tar.xz (el código exacto, para publicarlo junto al binario)
#
# LGPL: sin --enable-gpl ni --enable-nonfree, y sin una sola biblioteca externa
# (--disable-autodetect), así que lo único que hay que publicar con los binarios
# es el código de FFmpeg y este script, que dice cómo se compiló.
#
# Solo lleva lo que pide el análisis (src-tauri/src/lib.rs: analyze_audio,
# measure_phase, analyze_spectrum, analyze_stereo_width) y los formatos que la
# app analiza hoy: WAV, AIFF, FLAC, MP3, M4A (AAC y ALAC) y OGG (Vorbis y Opus).
# Un filtro o formato nuevo en esas órdenes se añade AQUÍ, o ffmpeg dirá que no
# lo encuentra.
#
# Necesita, en macOS: Command Line Tools, y con brew gnupg, nasm y mingw-w64.
set -euo pipefail

VERSION="9.0.2"
# Huella de la clave con la que FFmpeg firma sus versiones, tal como la publica
# https://ffmpeg.org/download.html.
FIRMA_FFMPEG="FCF986EA15E6E293A5644F10B4322F04D67658D8"
MACOS_MIN="11.0"

OUT="${1:?Uso: bash scripts/build-ffmpeg.sh <carpeta de salida>}"
mkdir -p "$OUT"
OUT="$(cd "$OUT" && pwd)"

for herramienta in gpg nasm x86_64-w64-mingw32-gcc clang make; do
  command -v "$herramienta" >/dev/null || { echo "Falta $herramienta." >&2; exit 1; }
done

WORK="$(mktemp -d "${TMPDIR:-/tmp}/build-ffmpeg.XXXXXX")"
trap 'rm -rf "$WORK"' EXIT
cd "$WORK"

# ————— El código, con su firma comprobada —————
TARBALL="ffmpeg-$VERSION.tar.xz"
curl -sSfLO "https://ffmpeg.org/releases/$TARBALL"
curl -sSfLO "https://ffmpeg.org/releases/$TARBALL.asc"
curl -sSfLo ffmpeg-devel.asc "https://ffmpeg.org/ffmpeg-devel.asc"
export GNUPGHOME="$WORK/gnupg"
mkdir -m 700 "$GNUPGHOME"
gpg --batch --quiet --import ffmpeg-devel.asc
# --status-fd da la huella de la clave que firmó: se compara con la publicada,
# no con la que venga en el archivo descargado.
FIRMO="$(gpg --batch --status-fd 1 --verify "$TARBALL.asc" "$TARBALL" 2>/dev/null \
  | awk '$2 == "VALIDSIG" { print $3 }')"
if [ "$FIRMO" != "$FIRMA_FFMPEG" ]; then
  echo "La firma de $TARBALL no es la de FFmpeg ($FIRMO)." >&2
  exit 1
fi
echo "Firma de $TARBALL comprobada ($FIRMA_FFMPEG)."
tar -xJf "$TARBALL"
SRC="$WORK/ffmpeg-$VERSION"
cp "$TARBALL" "$OUT/"

# ————— Lo que lleva —————
FILTROS="ebur128,astats,asetnsamples,aphasemeter,ametadata,loudnorm,asplit,bandpass,aformat,pan,aresample,anull"
CONTENEDORES="wav,aiff,flac,mp3,mov,aac,ogg"
ANALIZADORES="flac,mpegaudio,aac,vorbis,opus"
DECODIFICADORES="pcm_s16le,pcm_s24le,pcm_s32le,pcm_f32le,pcm_f64le,pcm_u8,pcm_s8"
DECODIFICADORES+=",pcm_s16be,pcm_s24be,pcm_s32be,pcm_f32be,pcm_f64be,pcm_alaw,pcm_mulaw"
DECODIFICADORES+=",adpcm_ms,adpcm_ima_wav,adpcm_ima_qt"
DECODIFICADORES+=",flac,mp3,mp3float,aac,alac,vorbis,opus"

COMUN=(
  --disable-everything --disable-autodetect --disable-network
  --disable-doc --disable-ffplay --disable-ffprobe --disable-avdevice --disable-swscale
  --enable-ffmpeg
  --enable-protocol=file,pipe
  --enable-demuxer="$CONTENEDORES"
  --enable-parser="$ANALIZADORES"
  --enable-decoder="$DECODIFICADORES"
  # Todas las órdenes acaban en `-f null -`: el muxer null y el códec que pide.
  --enable-muxer=null --enable-encoder=pcm_s16le
  --enable-filter="$FILTROS"
)

compilar() {
  local nombre="$1"; shift
  mkdir "$WORK/$nombre"
  ( cd "$WORK/$nombre" && "$SRC/configure" "${COMUN[@]}" "$@" >configure.log 2>&1 ) || {
    tail -n 30 "$WORK/$nombre/configure.log" >&2; exit 1; }
  make -C "$WORK/$nombre" -j"$(sysctl -n hw.ncpu 2>/dev/null || echo 4)" >"$WORK/$nombre.make.log" 2>&1 || {
    tail -n 30 "$WORK/$nombre.make.log" >&2; exit 1; }
}

# ————— macOS Apple Silicon —————
compilar mac --arch=arm64 \
  --extra-cflags="-mmacosx-version-min=$MACOS_MIN" --extra-ldflags="-mmacosx-version-min=$MACOS_MIN"
cp "$WORK/mac/ffmpeg" "$OUT/ffmpeg-$VERSION-aarch64-apple-darwin"

# ————— Windows x86_64 —————
# Hilos de Windows y todo estático: el .exe no puede pedir libwinpthread-1.dll
# ni libgcc_s_seh-1.dll, que no existen en un Windows limpio.
compilar win --enable-cross-compile --target-os=mingw32 --arch=x86_64 \
  --cross-prefix=x86_64-w64-mingw32- --pkg-config=false \
  --disable-pthreads --enable-w32threads \
  --extra-ldflags="-static -static-libgcc"
cp "$WORK/win/ffmpeg.exe" "$OUT/ffmpeg-$VERSION-x86_64-pc-windows-msvc.exe"

echo "Compilado en $OUT:"
ls -l "$OUT"
