#!/usr/bin/env bash
# make-karaoke.sh
# Convierte canciones de songs/ a versiones karaoke en songs-karaoke/
# Método: pan=stereo|c0=c0-0.7*c1|c1=c1-0.7*c0
#   Resta 70% del canal opuesto — elimina vocales centradas, preserva bajo y reverb.
#   Pérdida ~2.6 dB vs original. Sin eco metálico (comb-filtering).
#   DESCARTADO: stereotools mlev=0.015625 → -36dB Mid → eco metálico en salsa/cumbia.
#
# Uso:
#   ./scripts/make-karaoke.sh              # todas las canciones nuevas (skip si ya existe)
#   ./scripts/make-karaoke.sh --force      # regenerar todas aunque existan
#   ./scripts/make-karaoke.sh "songs/cancion.mp3"  # una sola canción

set -euo pipefail

PROJECT_ROOT="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
SONGS_DIR="$PROJECT_ROOT/songs"
KARAOKE_DIR="$PROJECT_ROOT/songs-karaoke"
FILTER="pan=stereo|c0=c0-0.7*c1|c1=c1-0.7*c0"
FORCE=0
SINGLE=""

for arg in "$@"; do
    case "$arg" in
        --force) FORCE=1 ;;
        *.mp3)   SINGLE="$arg" ;;
    esac
done

mkdir -p "$KARAOKE_DIR"

process_song() {
    local input="$1"
    local fname
    fname=$(basename "$input")
    local output="$KARAOKE_DIR/$fname"

    if [[ $FORCE -eq 0 ]] && [[ -f "$output" ]]; then
        echo "SKIP $fname"
        return 0
    fi

    local start=$SECONDS
    ffmpeg -i "$input" -af "$FILTER" -q:a 3 "${output}.tmp.mp3" -y 2>/dev/null

    local orig_dur out_dur
    orig_dur=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "$input" 2>/dev/null | cut -d. -f1)
    out_dur=$(ffprobe -v quiet -show_entries format=duration -of csv=p=0 "${output}.tmp.mp3" 2>/dev/null | cut -d. -f1)

    local diff=$(( orig_dur - out_dur ))
    [[ $diff -lt 0 ]] && diff=$(( -diff ))

    if [[ $diff -le 1 ]]; then
        mv "${output}.tmp.mp3" "$output"
        echo "OK [$((SECONDS - start))s] $fname"
    else
        rm -f "${output}.tmp.mp3"
        echo "DURATION_MISMATCH orig=${orig_dur}s out=${out_dur}s $fname" >&2
        return 1
    fi
}

if [[ -n "$SINGLE" ]]; then
    process_song "$SINGLE"
else
    PROCESSED=0
    FAILED=0
    START=$SECONDS
    for f in "$SONGS_DIR"/*.mp3; do
        if process_song "$f"; then
            PROCESSED=$((PROCESSED + 1))
        else
            FAILED=$((FAILED + 1))
        fi
    done
    echo ""
    echo "=== DONE: $PROCESSED OK, $FAILED FAILED — $((SECONDS - START))s total ==="
fi
