#!/bin/bash
# Usage: ./compress-video.sh <video-datei>

set -o pipefail

if [[ $# -lt 1 ]]; then
  echo "Verwendung: $0 <video-datei>"
  exit 1
fi

input=$1

if [[ ! -f "$input" ]]; then
  echo "Fehler: Datei nicht gefunden: $input"
  exit 1
fi

for cmd in ffmpeg ffprobe awk stat; do
  if ! command -v "$cmd" >/dev/null 2>&1; then
    echo "Fehler: '$cmd' ist nicht installiert."
    exit 1
  fi
done

# CRF-Wert abfragen
read -rp "CRF-Wert (Standard 25, kleiner = bessere Qualität): " crf
crf="${crf:-25}"

# Eingabe validieren: CRF zwischen 0 und 51
if ! [[ "$crf" =~ ^[0-9]+$ ]] || (( crf > 51 )); then
  echo "Fehler: Ungültiger CRF-Wert. Erlaubt sind ganze Zahlen von 0 bis 51."
  exit 1
fi

# Dateiinformationen
input_dir=$(dirname -- "$input")
filename=$(basename -- "$input")
name="${filename%.*}"
output="${input_dir}/${name}_komprimiert.mp4"

if [[ -e "$output" ]]; then
  echo "Fehler: Zieldatei existiert bereits: $output"
  exit 1
fi

input_size=$(stat -c%s -- "$input")

duration=$(ffprobe -v error \
  -show_entries format=duration \
  -of default=noprint_wrappers=1:nokey=1 \
  "$input" 2>/dev/null || true)

echo
echo "Eingabedatei:      $input"
echo "Dateigröße:        $((input_size / 1000000)) MB"

if [[ -n "$duration" ]]; then
  echo "Gesamtdauer:       ${duration} Sekunden"
fi

echo "CRF-Wert:          $crf"
echo "Ausgabedatei:      $output"
echo
echo "Starte Komprimierung ..."
echo

if ! ffmpeg -hide_banner -n -i "$input" \
  -vcodec libx264 -crf "$crf" \
  "$output"; then
  echo "Fehler beim Komprimieren."
  rm -f -- "$output"
  exit 1
fi

if [[ ! -s "$output" ]]; then
  echo "Fehler: Ausgabedatei ist leer."
  rm -f -- "$output"
  exit 1
fi

output_size=$(stat -c%s -- "$output")
saved=$(awk -v i="$input_size" -v o="$output_size" \
  'BEGIN { printf "%.1f", (1 - o / i) * 100 }')

echo
echo "Originalgröße:     $((input_size / 1000000)) MB"
echo "Komprimiert:       $((output_size / 1000000)) MB"
echo "Ersparnis:         ${saved} %"
echo
echo "Erstellt: $output"
