#!/usr/bin/env bash
set -euo pipefail

########################################
# CONFIG / ARGUMENTS
########################################
if [[ $# -lt 1 ]]; then
  echo "Usage: $0 /path/to/VIDEO_TS [output.mp4] [audio_index]"
  exit 1
fi

VIDEO_TS="$(cd "$1" && pwd)"
SRC_DIR="$(dirname "$VIDEO_TS")"
OUT="${2:-$(basename "$SRC_DIR").mp4}"
AIDX="${3:-0}"

########################################
# PRE-FLIGHT CHECKS
########################################
echo "==== VIDEO_TS → Apple TV converter ===="
echo "Source VIDEO_TS : $VIDEO_TS"
echo "Source base dir : $SRC_DIR"
echo "Output file    : $OUT"
echo "Audio index    : $AIDX"
echo

command -v ffmpeg  >/dev/null || { echo "ERROR: ffmpeg not found"; exit 1; }
command -v ffprobe >/dev/null || { echo "ERROR: ffprobe not found"; exit 1; }

[[ -d "$VIDEO_TS" ]] || { echo "ERROR: VIDEO_TS directory not found"; exit 1; }

shopt -s nullglob

########################################
# FIND MAIN TITLE SET
########################################
echo ">>> Scanning VOBs to find main title set..."

main_vob="$(
  ls -1 "$VIDEO_TS"/VTS_[0-9][0-9]_1.VOB 2>/dev/null | while read -r f; do
    size="$(stat -f%z "$f" 2>/dev/null || stat -c%s "$f")"
    printf "%12s  %s\n" "$size" "$f"
  done | sort -nr | head -n1 | awk '{print $2}'
)"

if [[ -z "${main_vob:-}" ]]; then
  echo "ERROR: No VTS_XX_1.VOB files found"
  exit 1
fi

ts="$(basename "$main_vob" | cut -c5-6)"
echo ">>> Selected title set: VTS_${ts}_*.VOB"
echo

vobs=( "$VIDEO_TS"/VTS_"$ts"_[0-9].VOB )

########################################
# TEMP WORK DIRECTORY (NEXT TO SOURCE)
########################################
TMPDIR="$SRC_DIR/.vts_work_$(date +%Y%m%d_%H%M%S)"
mkdir -v "$TMPDIR"

JOINED="$TMPDIR/joined.vob"

########################################
# JOIN VOBS (BYTE CONCAT)
########################################
echo ">>> Joining VOB files:"
for v in "${vobs[@]}"; do
  echo "    + $(basename "$v")"
done

cat "${vobs[@]}" > "$JOINED"
ls -lh "$JOINED"
echo

########################################
# AUDIO STREAM INSPECTION
########################################
echo ">>> Probing audio streams..."
ffprobe \
  -hide_banner \
  -loglevel info \
  -select_streams a \
  -show_entries stream=index,codec_name,channels,channel_layout:stream_tags=language,title \
  -of default=noprint_wrappers=1 \
  "$JOINED" || true

echo
echo ">>> Using audio stream index: $AIDX"
echo

########################################
# TRANSCODE
########################################
echo ">>> Starting ffmpeg transcoding..."
echo "    (this will take a while)"

ffmpeg -y \
  -loglevel verbose \
  -stats \
  -analyzeduration 200M \
  -probesize 200M \
  -fflags +genpts \
  -i "$JOINED" \
  -map 0:v:0 -map 0:a:"$AIDX" \
  -vf "bwdif=mode=send_field,scale='min(1920,iw)':'-2'" \
  -c:v libx264 -preset medium -crf 19 \
  -profile:v high -level 4.1 -pix_fmt yuv420p \
  -c:a aac -b:a 192k -ac 2 \
  -movflags +faststart \
  "$OUT"

echo
echo ">>> Transcoding completed successfully"

########################################
# CLEANUP
########################################
echo ">>> Cleaning up temporary files..."
rm -rfv "$TMPDIR"

echo "==== DONE ===="

