#!/usr/bin/env bash

set -o pipefail

SCRIPT_DIR="$(dirname "$(realpath "$0")")"
CLI_SCRIPT="$SCRIPT_DIR/video-frame-extract.sh"

VIDEO="${1:-}"
HOUR=0
MIN=0
SEC="0.000"
FORMAT="png"

TMPDIR="/tmp/frame-gui-$$"
PREVIEW="$TMPDIR/preview.png"

mkdir -p "$TMPDIR"

cleanup() {
    rm -rf "$TMPDIR"
}
trap cleanup EXIT


require() {
    command -v "$1" >/dev/null 2>&1 || {
        yad --error --text="Falta instalar: $1"
        exit 1
    }
}

require yad
require ffmpeg
require mpv


normalize_path() {

    local path="$1"

    path="${path#file://}"

    printf "%b" "${path//%20/ }"

}


get_video_dir() {

    if [[ -f "$VIDEO" ]]; then
        dirname "$VIDEO"
    else
        pwd
    fi

}


generate_preview() {

    ffmpeg -y -loglevel error \
        -ss "$1" \
        -i "$2" \
        -frames:v 1 \
        "$PREVIEW"

}


play_video() {

    mpv --force-window=yes "$1"

}


OUTDIR="$(get_video_dir)"

while true
do

FORM=$(yad \
    --title="Extractor de frame de vídeo" \
    --window-icon="video-x-generic" \
    --width=520 \
    --form \
    --separator="|" \
    --field="Vídeo:FL" "$VIDEO" \
    --field="Hora:NUM" "$HOUR!0..23!1" \
    --field="Minuto:NUM" "$MIN!0..59!1" \
    --field="Segundo (con ms):" "$SEC" \
    --field="Directorio salida:DIR" "$OUTDIR" \
    --field="Formato:CB" "$FORMAT!png!jpg" \
    --button="▶ Reproducir vídeo:0" \
    --button="🔎 Vista previa:1" \
    --button="📸 Extraer frame:2" \
    --button="Salir:3")

RET=$?

[ $RET -eq 3 ] && exit 0

VIDEO=$(echo "$FORM" | cut -d'|' -f1)
HOUR=$(echo "$FORM" | cut -d'|' -f2)
MIN=$(echo "$FORM" | cut -d'|' -f3)
SEC=$(echo "$FORM" | cut -d'|' -f4)
OUTDIR=$(echo "$FORM" | cut -d'|' -f5)
FORMAT=$(echo "$FORM" | cut -d'|' -f6)

VIDEO=$(normalize_path "$VIDEO")

if [[ ! -f "$VIDEO" ]]; then
    yad --error --text="Selecciona un vídeo válido."
    continue
fi

TIME=$(printf "%02d:%02d:%s" "$HOUR" "$MIN" "$SEC")


case "$RET" in

0)

play_video "$VIDEO"

;;

1)

(
echo "10"; echo "# Generando vista previa..."

generate_preview "$TIME" "$VIDEO"

echo "100"; echo "# Vista previa lista"

) | yad --progress \
    --window-icon="video-x-generic" \
    --title="Generando preview" \
    --auto-close

if [[ -f "$PREVIEW" ]]; then

yad --image="$PREVIEW" \
    --window-icon="video-x-generic" \
    --title="Vista previa del frame"

else

yad --error --text="No se pudo generar la vista previa."

fi

;;

2)

(
echo "10"; echo "# Extrayendo frame..."

ARGS=(-v "$VIDEO" -t "$TIME" -f "$FORMAT" -o "$OUTDIR")

OUTPUT=$("$CLI_SCRIPT" "${ARGS[@]}" 2>&1)

echo "90"; echo "# Finalizando..."
sleep 0.3
echo "100"; echo "# Completado"

) | yad --progress \
    --window-icon="video-x-generic" \
    --title="Extrayendo frame" \
    --auto-close

yad --text-info \
    --window-icon="video-x-generic" \
    --title="Resultado" \
    --width=650 \
    --height=350 \
    --filename=<(echo "$OUTPUT")

;;

esac

done