#!/usr/bin/env bash
# voice/replace_audio.sh
set -euo pipefail

die() {
    echo "Error: $*" >&2
    exit 1
}

usage() {
    cat <<'EOF'
Usage:
  replace_audio.sh <manifest_file> <video_file> <output_video_file>

Пример:
  replace_audio.sh voice/segments/segments.txt rendered_video.mp4 final_output.mp4
EOF
}

require_command() {
    command -v "$1" >/dev/null 2>&1 || die "missing required command: $1"
}

[ $# -eq 3 ] || { usage; exit 1; }
MANIFEST="$1"
VIDEO_IN="$2"
VIDEO_OUT="$3"

require_command ffmpeg
require_command ffprobe

# 1. Создаем временный список файлов для ffmpeg concat
TEMP_LIST="$(mktemp)"
trap 'rm -f "$TEMP_LIST"' EXIT

# 2. Читаем манифест, сортируем по времени и создаем list.txt для ffmpeg
#    ffmpeg concat требует файлы без указания таймкодов, просто последовательно.
#    Мы также проверяем, что аудиофайлы существуют.
echo "Сборка временного списка аудиофайлов из манифеста..."
while IFS= read -r line; do
    [[ -z "$line" ]] && continue
    audio_file=$(echo "$line" | awk '{print $2}')
    if [ -f "$audio_file" ]; then
        # Экранируем спецсимволы в пути для ffmpeg concat
        printf "file '%s'\n" "$(echo "$audio_file" | sed "s/'/'\\\\''/g")" >> "$TEMP_LIST"
    else
        echo "Предупреждение: файл '$audio_file' не найден. Пропускаем." >&2
    fi
done < "$MANIFEST"

# Проверяем, что список не пуст
if [ ! -s "$TEMP_LIST" ]; then
    die "Не найдено ни одного аудиофайла из манифеста."
fi

# 3. Объединяем все аудиофрагменты в один временный файл
TEMP_AUDIO="$(mktemp).mp3"
echo "Объединение аудиофрагментов в $TEMP_AUDIO ..."
ffmpeg -y -f concat -safe 0 -i "$TEMP_LIST" -c copy "$TEMP_AUDIO" || die "Ошибка объединения аудио."

# 4. Получаем длительность итогового аудио
AUDIO_DURATION=$(ffprobe -v error -show_entries format=duration -of default=noprint_wrappers=1:nokey=1 "$TEMP_AUDIO")
echo "Длительность озвучки: $AUDIO_DURATION секунд"

# 5. Накладываем аудио на видео (обрезаем или дополняем тишиной до длины видео)
#    -shortest обрежет по самому короткому потоку (в нашем случае это, скорее всего, аудио)
#    Чтобы видео не обрезалось, используем фильтр apad, который добавит тишины, если аудио короче.
echo "Наложение аудио на видео..."
ffmpeg -y -i "$VIDEO_IN" -i "$TEMP_AUDIO" \
    -filter_complex "[1:a]apad[aud]" \
    -map 0:v:0 -map "[aud]" \
    -c:v copy \
    -c:a aac -b:a 192k \
    -shortest \
    "$VIDEO_OUT"

echo "Готово! Финальное видео: $VIDEO_OUT"