#!/bin/bash
# Finalize: pega vídeo silencioso, retima para bater com áudio master, faz upscale para 1080, adiciona áudio.
set -euo pipefail

SILENT="${1:?silent video mp4}"
AUDIO="${2:?audio m4a}"
OUT_W="${3:?output width}"
OUT_H="${4:?output height}"
OUT="${5:?output mp4}"

AUDIO_DUR=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$AUDIO")
VIDEO_DUR=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$SILENT")
# retime factor: multiplicador de PTS - se video 44s e audio 51s, PTS *= 51/44 = 1.16 (mais lento)
FACTOR=$(python3 -c "print(f'{$AUDIO_DUR/$VIDEO_DUR:.4f}')")

echo "silent=${VIDEO_DUR}s  audio=${AUDIO_DUR}s  setpts_factor=${FACTOR}"

# Se factor > 1.02 ou < 0.98, retima
if python3 -c "import sys; sys.exit(0 if abs($FACTOR-1) > 0.02 else 1)"; then
  # retima E upscale numa passada só
  ffmpeg -y -i "$SILENT" -i "$AUDIO" \
    -filter_complex "[0:v]setpts=${FACTOR}*PTS,scale=${OUT_W}:${OUT_H}:flags=lanczos[v]" \
    -map "[v]" -map "1:a" \
    -c:v libx264 -pix_fmt yuv420p -preset medium -crf 18 -profile:v high -level 4.2 \
    -c:a aac -b:a 192k -ar 48000 \
    -movflags +faststart \
    -shortest \
    "$OUT"
else
  ffmpeg -y -i "$SILENT" -i "$AUDIO" \
    -vf "scale=${OUT_W}:${OUT_H}:flags=lanczos" \
    -c:v libx264 -pix_fmt yuv420p -preset medium -crf 18 -profile:v high -level 4.2 \
    -c:a aac -b:a 192k -ar 48000 \
    -movflags +faststart \
    -shortest \
    "$OUT"
fi

FINAL_DUR=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$OUT")
echo "[done] $OUT (${FINAL_DUR}s)"
