#!/usr/bin/env bash

set -Eeuo pipefail
shopt -s nullglob

source_dir="${1:-/multimedia/db/03-dbgt}"
output_dir="${2:-/multimedia/db/03-dbgt-HD}"
tool_dir="/multimedia/db/.tools/realesrgan-ncnn-vulkan"
upscaler="$tool_dir/realesrgan-ncnn-vulkan-v0.2.0-ubuntu/realesrgan-ncnn-vulkan"
models="$tool_dir/models"
work_root="${TMPDIR:-/tmp}/realesrgan-dbgt"
frame_rate="2997/125"
chunk_seconds=30
video_crf=28
video_preset=6
audio_bitrate=192k

mkdir -p "$output_dir" "$work_root"

for source in "$source_dir"/*.mp4; do
    name="${source##*/}"
    stem="${name%.mp4}"
    final="$output_dir/$stem [AI 2x 1440x1080].webm"

    if [[ -s "$final" ]]; then
        printf 'Skipping completed episode: %s\n' "$name"
        continue
    fi

    duration="$(ffprobe -v error -show_entries format=duration -of default=nk=1:nw=1 "$source")"
    duration_seconds="${duration%.*}"
    work="$work_root/$stem"

    # An interrupted episode is restarted so no stale segment can enter the final video.
    rm -rf "$work"
    mkdir -p "$work/input" "$work/output" "$work/segments"

    printf 'Processing: %s\n' "$name"

    part=0
    for ((start = 0; start < duration_seconds; start += chunk_seconds)); do
        printf '  Segment %d at %ss\n' "$((part + 1))" "$start"
        rm -rf "$work/input" "$work/output"
        mkdir -p "$work/input" "$work/output"

        ffmpeg -hide_banner -loglevel error -ss "$start" -i "$source" -t "$chunk_seconds" \
            -map 0:v:0 -an "$work/input/%08d.png"

        "$upscaler" -i "$work/input" -o "$work/output" -m "$models" \
            -n realesr-animevideov3 -s 2 -f png -g 0 -j 4:4:4

        ffmpeg -hide_banner -loglevel error -y \
            -framerate "$frame_rate" -start_number 1 -i "$work/output/%08d.png" \
            -framerate "$frame_rate" -start_number 1 -i "$work/input/%08d.png" \
            -filter_complex \
              "[1:v][0:v]scale2ref=flags=lanczos[base][ia];[ia][base]blend=all_expr='A*0.25+B*0.75',format=yuv420p[v]" \
            -map "[v]" -c:v libsvtav1 -preset "$video_preset" -crf "$video_crf" \
            -g 240 -an "$work/segments/$(printf '%04d' "$part").webm"
        ((part += 1))
    done

    : > "$work/concat.txt"
    for segment in "$work/segments"/*.webm; do
        printf "file '%s'\n" "$segment" >> "$work/concat.txt"
    done

    ffmpeg -hide_banner -loglevel error -y -f concat -safe 0 -i "$work/concat.txt" \
        -map 0:v:0 -c copy "$work/video.webm"

    # Audio is encoded as web-friendly Opus after all video chunks are joined.
    ffmpeg -hide_banner -loglevel error -y -i "$work/video.webm" -i "$source" \
        -map 0:v:0 -map '1:a?' -map_metadata 1 -map_chapters 1 -c:v copy \
        -c:a libopus -b:a "$audio_bitrate" -vbr on -ar 48000 -ac 2 -application audio \
        -shortest "$final"

    rm -rf "$work"
    printf 'Completed: %s\n' "$final"
done
