#!/usr/bin/env bash
# ============================================================================
# install.sh – Erstinstallation der Ulanzi-Deck-Software auf einem NEUEN Gerät
# ============================================================================
#
# Installiert auf einem frischen Rechner:
#   1. System-Pakete (Arch-Gruppe 'gambas3' für die GUI-Runtime, jq,
#      lm_sensors, uv; erfordert bei Bedarf sudo)
#   2. udev-Regel, damit das Deck per hidraw OHNE root lesbar ist (sudo)
#   3. Daemon 'ulanzi-studio-niri' als uv-Tool (lokal aus ./daemon)
#   4. GUI-Binary U-Studio.gambas + Hilfsskripte nach ~/.local/bin
#      und ~/.config/ulanzi-niri
#   5. sensors.sh/fps.sh nach $HOME
#   6. Test-Start des Decks (deckstart.sh)
#
# NICHT angefasst wird der Nutzer-Bestand:
#   - ~/.config/ulanzi-niri/config.toml (nur kopiert, falls er fehlt)
#   - bestehende Sensordaten / Einstellungen
#
# Aufruf:  ./install.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"
CONFIG_EXAMPLE="$SETUP_DIR/config.toml.example"

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; }

has_sudo() { cmd sudo && sudo -n true 2>/dev/null; }
run_sudo() {
  if has_sudo; then sudo "$@"; else "$@"; fi
}

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

# ---------------------------------------------------------------------------
# 0. Voraussetzungen prüfen
# ---------------------------------------------------------------------------
for b in bash udevadm; do
  cmd "$b" || die "Pflichtprogramm '$b' fehlt im PATH"
done

# ---------------------------------------------------------------------------
# 1. System-Pakete
# ---------------------------------------------------------------------------
info "System-Pakete prüfen …"
if cmd pacman; then
  if ! cmd uv || ! cmd jq || ! cmd sensors || ! ls /usr/lib/gambas3 >/dev/null 2>&1; then
    info "Verwende pacman für: gambas3 (Gruppe), jq, lm_sensors, uv"
    PKGS=( )
    cmd uv       || PKGS+=( uv )
    cmd jq       || PKGS+=( jq )
    cmd sensors  || PKGS+=( lm_sensors )
    ls /usr/lib/gambas3 >/dev/null 2>&1 || PKGS+=( gambas3 )
    if [ "${#PKGS[@]}" -gt 0 ]; then
      run_sudo pacman -S --needed --noconfirm "${PKGS[@]}"
    fi
  else
    info "Alle System-Pakete bereits vorhanden."
  fi
else
  warn "Kein pacman gefunden – bitte manuell installieren:"
  echo "    - Gambas3-Runtime (inkl. gb.qt6, gb.dbus, gb.image, gb.settings, gb.form.dialog)"
  echo "    - jq, lm_sensors (Command 'sensors'), uv"
fi

# ---------------------------------------------------------------------------
# 2. udev-Regel für hidraw-Zugriff (ohne root)
# ---------------------------------------------------------------------------
RULES_SRC="$SETUP_DIR/udev/99-ulanzi-uaccess.rules"
RULES_DST="/etc/udev/rules.d/99-ulanzi-uaccess.rules"
if [ -f "$RULES_SRC" ]; then
  info "udev-Regel installieren (sudo erforderlich) …"
  if has_sudo; 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."
    echo "    Bitte manuell:  sudo install -m 644 '$RULES_SRC' '$RULES_DST'"
    echo "    danach:          sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=hidraw"
  fi
fi

# ---------------------------------------------------------------------------
# 3. Daemon als uv-Tool installieren (lokal aus ./daemon)
# ---------------------------------------------------------------------------
if cmd uv; then
  info "Daemon 'ulanzi-studio-niri' installieren (uv tool install ./daemon) …"
  uv tool install "$SETUP_DIR/daemon"
  cmd ulanzi-niri || die "ulanzi-niri nach der Installation nicht im PATH gefunden"
  info "Daemon-Version: $(ulanzi-niri --version 2>&1 | head -1)"
else
  die "uv nicht verfügbar – Daemon kann nicht installiert werden."
fi

# ---------------------------------------------------------------------------
# 4. GUI-Binary + Hilfsskripte installieren
# ---------------------------------------------------------------------------
info "GUI und Skripte nach $DEST_BIN und $DECK_DIR installieren …"
mkdir -p "$DEST_BIN" "$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"

# deckstart.sh ruft ulanziread aus seinem eigenen Verzeichnis auf.
# Die GUI kopiert diese Dateien bei Bedarf selbst (PrepareScripts/checkchriptfiles)
# aus dem Binary-Verzeichnis – deshalb legen wir sie auch dorthin.
install -m 755 "$SETUP_DIR/scripts/deckstart.sh" "$DEST_BIN/deckstart.sh"
install -m 755 "$SETUP_DIR/ulanziread/ulanziread" "$DEST_BIN/ulanziread"

# sensors.sh/fps.sh zusätzlich in $HOME (GetJsonValue ruft $HOME/sensors.sh)
install -m 755 "$SETUP_DIR/scripts/sensors.sh" "$HOME/sensors.sh"
install -m 755 "$SETUP_DIR/scripts/fps.sh"     "$HOME/fps.sh"

# PATH sicherstellen (~/.local/bin)
if [[ ":$PATH:" != *":$DEST_BIN:"* ]]; then
  warn "$DEST_BIN ist nicht im PATH. GUI startbar via: $DEST_BIN/U-Studio"
fi

# ---------------------------------------------------------------------------
# 5. config.toml anlegen (nur falls noch keiner existiert)
# ---------------------------------------------------------------------------
if [ ! -f "$DECK_DIR/config.toml" ]; then
  if [ -f "$CONFIG_EXAMPLE" ]; then
    info "Kein config.toml gefunden – Beispiel wird als Startpunkt kopiert."
    install -m 644 "$CONFIG_EXAMPLE" "$DECK_DIR/config.toml"
  fi
fi

# ---------------------------------------------------------------------------
# 6. Test-Start des Decks
# ---------------------------------------------------------------------------
info "Deck testen (deckstart.sh) …"
"$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 gestartet. Logs: /tmp/ulanzi-debug.log und /tmp/ulanzi-daemon.log"
fi

# ---------------------------------------------------------------------------
echo ""
echo "===================================================================="
echo " FERTIG. Nächste Schritte:"
echo "   - GUI starten:    $DEST_BIN/U-Studio"
echo "   - Deck neu starten: $DECK_DIR/deckstart.sh"
echo "   - Logs:           tail -f /tmp/ulanzi-daemon.log /tmp/ulanzi-debug.log"
[ -f "$VERFILE" ] && { echo "   - Installierte Version:"; cat "$VERFILE"; }
echo "===================================================================="