#!/usr/bin/env bash
# Tastron — Erst-Einrichtung der Berechtigungen
#
# Konfiguriert input-Gruppe + uinput-Modul + udev-Regel. Fragt einmalig
# nach dem sudo-Passwort. Muss EINMAL nach der Installation laufen.
#
#   ./setup-tastron.sh

set -euo pipefail

RED=$'\e[31m'; GREEN=$'\e[32m'; YELLOW=$'\e[33m'; BOLD=$'\e[1m'; RESET=$'\e[0m'
info()    { echo "${GREEN}[OK]${RESET} $*"; }
warn()    { echo "${YELLOW}[!]${RESET} $*"; }
err()     { echo "${RED}[X]${RESET} $*" >&2; }
section() { echo; echo "${BOLD}$*${RESET}"; }

if [[ $EUID -eq 0 ]]; then
    err "Bitte NICHT als root ausführen — das Script ruft sudo selbst auf."
    exit 1
fi

TARGET_USER="${SUDO_USER:-$USER}"
section "Tastron Erst-Einrichtung für User ${BOLD}${TARGET_USER}${RESET}"

# --- 1. input-Gruppe ---
section "1) input-Gruppe"
if id -nG "$TARGET_USER" | tr ' ' '\n' | grep -qx input; then
    info "${TARGET_USER} ist bereits in der input-Gruppe."
    NEEDS_RELOGIN=0
else
    info "Füge ${TARGET_USER} zur input-Gruppe hinzu …"
    sudo usermod -a -G input "$TARGET_USER"
    NEEDS_RELOGIN=1
fi

# --- 2. uinput-Modul ---
section "2) uinput-Kernel-Modul"
if lsmod | grep -q '^uinput'; then
    info "uinput-Modul ist bereits geladen."
else
    info "Lade uinput-Modul …"
    sudo modprobe uinput
fi
if [[ ! -f /etc/modules-load.d/tastron-uinput.conf ]]; then
    info "Trage uinput in /etc/modules-load.d ein (Auto-Load beim Boot) …"
    echo "uinput" | sudo tee /etc/modules-load.d/tastron-uinput.conf > /dev/null
else
    info "uinput ist bereits für Auto-Load eingetragen."
fi

# --- 3. udev-Regel ---
section "3) udev-Regel für /dev/uinput"
UDEV_RULE=/etc/udev/rules.d/70-tastron-uinput.rules
if [[ -f $UDEV_RULE ]]; then
    info "udev-Regel ist bereits installiert."
else
    info "Installiere udev-Regel (gibt /dev/uinput der input-Gruppe frei) …"
    sudo tee "$UDEV_RULE" > /dev/null <<'EOF'
KERNEL=="uinput", GROUP="input", MODE="0660", OPTIONS+="static_node=uinput"
EOF
    sudo udevadm control --reload-rules
    sudo udevadm trigger /dev/uinput 2>/dev/null || true
fi

if [[ -w /dev/uinput ]]; then
    info "/dev/uinput ist schreibbar."
elif [[ -e /dev/uinput ]]; then
    warn "/dev/uinput existiert, aber noch nicht für die input-Gruppe."
    warn "Nach Logout/Login funktioniert es."
else
    warn "/dev/uinput fehlt — modprobe schlug nicht durch."
fi

# --- 4. OpenCV-Libraries finden ---
# OpenCV-Paketnamen ändern sich zwischen Ubuntu-Versionen (libopencv-core4.5d,
# libopencv-core406, libopencv-core406t64, …). Statt zu raten suchen wir
# nach den passenden Paketen mit apt-cache und installieren die, die's gibt.
section "4) OpenCV-Laufzeitbibliotheken"
if command -v apt-cache >/dev/null 2>&1; then
    # Welche OpenCV-Core-Pakete kennt diese Distro?
    OPENCV_PKGS=$(apt-cache search --names-only \
        '^libopencv-(core|imgproc|imgcodecs)[0-9].*$' 2>/dev/null \
        | awk '{print $1}' || true)
    if [[ -z "$OPENCV_PKGS" ]]; then
        warn "Keine libopencv-Pakete im apt-Cache gefunden."
        warn "Falls Tastron beim Start „cannot open shared object libopencv_…"
        warn "meldet, installiere libopencv-dev oder die passenden Libs manuell:"
        echo "    sudo apt install libopencv-dev"
    else
        # Prüfen welche schon installiert sind
        NEED_INSTALL=()
        for pkg in $OPENCV_PKGS; do
            if ! dpkg-query -W -f='${Status}' "$pkg" 2>/dev/null \
                 | grep -q '^install ok installed$'; then
                NEED_INSTALL+=("$pkg")
            fi
        done
        if [[ ${#NEED_INSTALL[@]} -eq 0 ]]; then
            info "Alle benötigten OpenCV-Libraries sind installiert."
        else
            info "Installiere OpenCV-Libraries: ${NEED_INSTALL[*]}"
            sudo apt install -y "${NEED_INSTALL[@]}"
        fi
    fi
else
    warn "apt nicht verfügbar — bitte OpenCV-Libraries manuell installieren."
fi

# --- 5. Sonstige empfohlene Pakete ---
section "5) Empfohlene Hilfs-Pakete"
MISSING=()
command -v xdotool  >/dev/null 2>&1 || MISSING+=("xdotool")
command -v wl-paste >/dev/null 2>&1 || MISSING+=("wl-clipboard")

if [[ ${#MISSING[@]} -eq 0 ]]; then
    info "Alle empfohlenen Pakete sind installiert."
else
    warn "Nicht installiert (optional, aber empfohlen):"
    for cmd in "${MISSING[@]}"; do
        case "$cmd" in
            xdotool)      echo "    - xdotool      (Cursor-Position auf X11/XWayland)";;
            wl-clipboard) echo "    - wl-clipboard (Clipboard-API auf Wayland)";;
        esac
    done
    if command -v apt >/dev/null 2>&1; then
        info "Installiere optionale Pakete …"
        sudo apt install -y "${MISSING[@]}"
    else
        echo
        echo "Arch:    sudo pacman -S ${MISSING[*]}"
        echo "Fedora:  sudo dnf install ${MISSING[*]}"
    fi
fi

# --- Abschluss ---
section "Fertig"
if [[ ${NEEDS_RELOGIN:-0} -eq 1 ]]; then
    warn "${BOLD}WICHTIG:${RESET}${YELLOW} Einmal ausloggen + wieder einloggen, damit die"
    warn "input-Gruppe aktiv wird. Erst danach funktionieren F8/F9 in Tastron."
else
    info "Alles startklar. Tastron kann jetzt gestartet werden."
fi
