#!/usr/bin/env bash
# ============================================================================
# update.sh – Update der Ulanzi-Deck-Software auf einem BESTEHENDEN Gerät
# ============================================================================
#
# Aktualisiert:
#   1. Daemon 'ulanzi-studio-niri' (uv tool install --force, lokal aus ./daemon)
#   2. GUI-Binary U-Studio.gambas + Hilfsskripte in ~/.local/bin
#      und ~/.config/ulanzi-niri
#   3. sensors.sh/fps.sh in $HOME
#   4. udev-Regel (falls nötig)
#
# Vorher gestoppt werden: GUI (U-Studio), Daemon (ulanzi-niri) und
# Button-Monitor (ulanziread). Danach wird das Deck neu gestartet.
#
# NICHT angefasst wird der Nutzer-Bestand:
#   - ~/.config/ulanzi-niri/config.toml  => Deine Seiten/Buttons bleiben erhalten
#   - ~/.config/gambas3/U-Studio.conf      => Deine Evangeliste/Sensoren
#
# Aufruf:  ./update.sh
# ============================================================================
set -uo pipefail

SETUP_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)"
VERFILE="$SETUP_DIR/VERSION"

DEST_BIN="${DEST_BIN:-$HOME/.local/bin}"
DECK_DIR="$HOME/.config/ulanzi-niri"

c_ok="\033[1;32m"; c_warn="\033[1;33m"; c_err="\033[1;31m"; c_off="\033[0m"
info()  { echo -e "${c_ok}==>${c_off} $*"; }
warn()  { echo -e "${c_warn}WARNUNG:${c_off} $*"; }
die()   { echo -e "${c_err}FEHLER:${c_off} $*"; exit 1; }
cmd()   { command -v "$1" >/dev/null 2>&1; }

echo "===================================================================="
echo " Ulanzi-Deck Update"
echo ""
[ -f "$VERFILE" ] && cat "$VERFILE"
echo ""
echo " Ziel-Rechner: $(hostname)  ($(date '+%Y-%m-%d %H:%M'))"
echo "===================================================================="

# ---------------------------------------------------------------------------
# 0. Sicherheitsabfrage
# ---------------------------------------------------------------------------
read -r -p "Laufende GUI/Daemon werden gestoppt. Weiter? [j/N] " ANS
case "$ANS" in
  j|J|y|Y) ;;
  *) die "Abgebrochen." ;;
esac

# ---------------------------------------------------------------------------
# 1. Laufende Prozesse stoppen
# ---------------------------------------------------------------------------
info "Stoppe GUI, Daemon und Monitor …"
pkill -x U-Studio 2>/dev/null
killall ulanzi-niri ulanziread 2>/dev/null
sleep 1
warn "Zur Sicherheit werden die Logs von /tmp/ulanzi-debug.log und /tmp/ulanzi-daemon.log NICHT gelöscht."

# ---------------------------------------------------------------------------
# 2. Daemon aktualisieren
# ---------------------------------------------------------------------------
if cmd uv; then
  info "Daemon aktualisieren (uv tool install --force ./daemon) …"
  uv tool install --force "$SETUP_DIR/daemon"
  cmd ulanzi-niri || die "ulanzi-niri nach dem Update nicht im PATH gefunden"
  info "Daemon-Version: $(ulanzi-niri --version 2>&1 | head -1)"
else
  die "uv nicht verfügbar – Daemon-Update ist nicht möglich."
fi

# ---------------------------------------------------------------------------
# 3. GUI + Hilfsskripte aktualisieren
# ---------------------------------------------------------------------------
[ -d "$DEST_BIN" ] || mkdir -p "$DEST_BIN"
[ -d "$DECK_DIR" ] || mkdir -p "$DECK_DIR"

install -m 755 "$SETUP_DIR/gui/U-Studio.gambas" "$DEST_BIN/U-Studio"
install -m 755 "$SETUP_DIR/scripts/sensors.sh"  "$DEST_BIN/sensors.sh"
install -m 755 "$SETUP_DIR/scripts/fps.sh"      "$DEST_BIN/fps.sh"
install -m 755 "$SETUP_DIR/scripts/deckstart.sh" "$DECK_DIR/deckstart.sh"
install -m 755 "$SETUP_DIR/ulanziread/ulanziread" "$DECK_DIR/ulanziread"

install -m 755 "$SETUP_DIR/scripts/deckstart.sh" "$DEST_BIN/deckstart.sh"
install -m 755 "$SETUP_DIR/ulanziread/ulanziread" "$DEST_BIN/ulanziread"

install -m 755 "$SETUP_DIR/scripts/sensors.sh" "$HOME/sensors.sh"
install -m 755 "$SETUP_DIR/scripts/fps.sh"     "$HOME/fps.sh"

info "Dateien aktualisiert."

# ---------------------------------------------------------------------------
# 4. udev-Regel (falls nötig)
# ---------------------------------------------------------------------------
RULES_SRC="$SETUP_DIR/udev/99-ulanzi-uaccess.rules"
RULES_DST="/etc/udev/rules.d/99-ulanzi-uaccess.rules"
if [ -f "$RULES_SRC" ] && [ ! -f "$RULES_DST" ]; then
  info "udev-Regel nachinstallieren …"
  if cmd sudo && sudo -n true 2>/dev/null; then
    sudo install -m 644 "$RULES_SRC" "$RULES_DST"
    sudo udevadm control --reload-rules
    sudo udevadm trigger --subsystem-match=hidraw
  else
    warn "Kein sudo ohne Passwort – Regel nicht installiert. Manuell:"
    echo "    sudo install -m 644 '$RULES_SRC' '$RULES_DST' && sudo udevadm control --reload-rules"
  fi
fi

# ---------------------------------------------------------------------------
# 5. Deck neu starten
# ---------------------------------------------------------------------------
info "Deck neu starten …"
"$DECK_DIR/deckstart.sh"
sleep 3
if [ -f /tmp/ulanzi-debug.log ] && grep -q "ERROR: no Ulanzi hidraw device" /tmp/ulanzi-debug.log; then
  warn "Kein Ulanzi-Deck gefunden – Bitte Deck per USB anschließen und deckstart.sh erneut ausführen."
else
  info "Deck läuft. Logs: /tmp/ulanzi-debug.log und /tmp/ulanzi-daemon.log"
fi

echo ""
echo "===================================================================="
echo " UPDATE FERTIG."
echo "   GUI starten:    $DEST_BIN/U-Studio"
echo "   Logs:           tail -f /tmp/ulanzi-daemon.log /tmp/ulanzi-debug.log"
echo "   Hinweis:        config.toml und U-Studio.conf wurden unverändert gelassen."
echo "===================================================================="