#!/usr/bin/env bash
#
# noctalia-plasma-setup.sh
# Setzt eine Quickshell-artige Desktop-Shell (Noctalia) neben KDE Plasma 6 / KWin Wayland auf,
# als KWin-taugliche Annaeherung an den Caelestia-Look (Hyprland).
#
# Fassung 1.1 - 2026-09-04
# Aenderung ggue. 1.0: pipewire / pipewire-pulse aus REPO_PKGS entfernt.
#   Grund: auf CachyOS ist das ein CachyOS-eigener Build (z.B. 1:1.6.8-1.2),
#   den gst-plugin-pipewire fest voraussetzt. Die Standard-[extra]-Version
#   (z.B. 1:1.6.8-1) ist aelter -> pacman verweigert den Downgrade-Konflikt.
#   Beide Pakete sind auf einem laufenden Plasma/CachyOS-System ohnehin
#   schon vorhanden, Noctalia braucht sie nicht neu installiert.
# Zielsysteme: CachyOS / Arch (flux = full, nx01 = lite)
#
# Das Skript installiert NUR. Es aendert von sich aus KEINE Plasma-Konfiguration,
# entfernt keine Panels und aktiviert keinen Autostart, solange du es nicht sagst.

set -euo pipefail

MODE="full"
DO_AUTOSTART=0
DRY_RUN=0

usage() {
    cat <<'USAGE'
Verwendung: ./noctalia-plasma-setup.sh [OPTIONEN]

  --lite         Sparvariante fuer schwache GPUs (nx01): kein cava/Visualizer,
                 keine Blur-Extras, keine schweren Schriftpakete.
  --autostart    Legt zusaetzlich einen Autostart-Eintrag an (~/.config/autostart).
                 Standard: aus. Erst manuell testen, dann aktivieren.
  --dry-run      Zeigt nur, was passieren wuerde.
  -h, --help     Diese Hilfe.
USAGE
}

while [[ $# -gt 0 ]]; do
    case "$1" in
        --lite)      MODE="lite"; shift ;;
        --autostart) DO_AUTOSTART=1; shift ;;
        --dry-run)   DRY_RUN=1; shift ;;
        -h|--help)   usage; exit 0 ;;
        *) echo "Unbekannte Option: $1" >&2; usage; exit 1 ;;
    esac
done

say()  { printf '\n\033[1;35m==>\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m[!]\033[0m %s\n' "$*" >&2; }
die()  { printf '\033[1;31m[x]\033[0m %s\n' "$*" >&2; exit 1; }

run() {
    if [[ $DRY_RUN -eq 1 ]]; then
        printf '    (dry-run) %s\n' "$*"
    else
        "$@"
    fi
}

# ---------------------------------------------------------------- Vorpruefung

say "Vorpruefung"

command -v pacman >/dev/null 2>&1 || die "Kein pacman gefunden. Das Skript ist fuer Arch/CachyOS."

if [[ $EUID -eq 0 ]]; then
    die "Bitte NICHT als root starten. Das Skript ruft sudo selbst auf, wo noetig."
fi

PLASMA_VER="$(plasmashell --version 2>/dev/null | awk '{print $NF}' || true)"
if [[ -z "$PLASMA_VER" ]]; then
    warn "plasmashell nicht gefunden - laeuft hier wirklich Plasma?"
else
    echo "    Plasma: $PLASMA_VER"
    case "$PLASMA_VER" in
        6.*) ;;
        *) warn "Noctalia braucht Plasma 6. Gefunden: $PLASMA_VER" ;;
    esac
fi

if [[ "${XDG_SESSION_TYPE:-}" != "wayland" ]]; then
    warn "Aktuelle Session ist '${XDG_SESSION_TYPE:-unbekannt}', nicht wayland."
    warn "Die Shell braucht wlr-layer-shell und laeuft nur unter Plasma (Wayland)."
    warn "Installieren geht trotzdem - vor dem Start in die Wayland-Session wechseln."
fi

echo "    Modus: $MODE"

# ------------------------------------------------------------- AUR-Helfer

AUR=""
for h in paru yay; do
    if command -v "$h" >/dev/null 2>&1; then AUR="$h"; break; fi
done
[[ -n "$AUR" ]] || die "Kein AUR-Helfer (paru/yay) gefunden. CachyOS hat normalerweise paru:  sudo pacman -S paru"
echo "    AUR-Helfer: $AUR"

# ------------------------------------------------------- Pakete aus den Repos

say "Repo-Pakete installieren"

# quickshell liegt seit 0.3.x in [extra] - kein AUR noetig.
# pipewire/pipewire-pulse bewusst NICHT hier drin (siehe Kommentar im Kopf).
REPO_PKGS=(
    quickshell
    networkmanager
    upower
    brightnessctl
    wl-clipboard
    qt6-tools
    python
)

if [[ "$MODE" == "full" ]]; then
    REPO_PKGS+=( cava ddcutil libqalculate inter-font ttf-jetbrains-mono-nerd )
fi

run sudo pacman -S --needed --noconfirm "${REPO_PKGS[@]}"

# -------------------------------------------------------------- Noctalia (AUR)

say "Noctalia aus dem AUR installieren (noctalia-git, upstream-gepflegt)"
run "$AUR" -S --needed --noconfirm noctalia-git

# ---------------------------------------------------- Binary ermitteln, nicht raten

say "Startbefehl ermitteln"
NOCTALIA_BIN=""
if [[ $DRY_RUN -eq 0 ]]; then
    while IFS= read -r p; do
        [[ -x "$p" ]] && { NOCTALIA_BIN="$p"; break; }
    done < <(pacman -Qlq noctalia-git 2>/dev/null | grep -E '^/usr/bin/' || true)
fi

if [[ -z "$NOCTALIA_BIN" && $DRY_RUN -eq 0 ]]; then
    warn "Konnte den Startbefehl nicht automatisch finden."
    warn "Selbst nachsehen:  pacman -Qlq noctalia-git | grep /usr/bin/"
    NOCTALIA_BIN="noctalia-shell"   # Rueckfallname, bitte pruefen
else
    echo "    Startbefehl: ${NOCTALIA_BIN:-<dry-run>}"
fi

# ------------------------------------------------------------------ Autostart

if [[ $DO_AUTOSTART -eq 1 ]]; then
    say "Autostart-Eintrag anlegen"
    AUTOSTART_DIR="$HOME/.config/autostart"
    run mkdir -p "$AUTOSTART_DIR"
    if [[ $DRY_RUN -eq 0 ]]; then
        cat > "$AUTOSTART_DIR/noctalia.desktop" <<DESKTOP
[Desktop Entry]
Type=Application
Name=Noctalia Shell
Comment=Quickshell-Shell neben Plasma (Caelestia-Annaeherung)
Exec=$NOCTALIA_BIN
X-KDE-autostart-phase=2
X-GNOME-Autostart-enabled=true
DESKTOP
        echo "    geschrieben: $AUTOSTART_DIR/noctalia.desktop"
    else
        printf '    (dry-run) schreibe %s/noctalia.desktop\n' "$AUTOSTART_DIR"
    fi
else
    say "Autostart uebersprungen (kein --autostart)"
fi

# --------------------------------------------------------------------- Ausgabe

say "Fertig. Naechste Schritte von Hand:"
cat <<NEXT

  1) TESTEN, bevor irgendetwas dauerhaft wird:
        $NOCTALIA_BIN
     In einem Terminal starten, anschauen, mit Strg+C wieder beenden.

  2) Plasma-Panel loswerden (reversibel, KEIN plasmashell killen):
        Rechtsklick aufs Panel -> "Kontrollleiste anzeigen" -> "Kontrollleiste entfernen"
     Zurueck: Rechtsklick auf den Desktop -> "Kontrollleiste hinzufuegen" -> "Standard-Kontrollleiste"

  3) Farben: Noctalia erzeugt das Farbschema aus dem Wallpaper (Material Design 3).
     Genau daher kommt der Pastell-Ton im Caelestia-Video - nicht aus einem festen Theme.
     Also: erst Wallpaper setzen, dann Palette generieren lassen.
        Generator "tonal-spot" oder "soft" kommt dem Video am naechsten.

  4) Was Plasma weiter uebernimmt (unter KWin fehlen die noetigen wlroots-Protokolle):
        Screenshots      -> Spectacle
        Zwischenablage   -> Klipper
        Nachtfarben      -> Systemeinstellungen
        Sperrbildschirm  -> Plasma-Sperrbildschirm

  5) Rueckbau komplett:
        rm -f ~/.config/autostart/noctalia.desktop
        $AUR -Rns noctalia-git
        Plasma-Panel wie unter 2) wieder hinzufuegen

NEXT

if [[ "$MODE" == "lite" ]]; then
    cat <<'LITE'
  nx01-Hinweise (Broadwell-iGPU):
    - In den Systemeinstellungen -> Fensterverhalten -> Arbeitsflaecheneffekte:
      "Weichzeichnen" und "Hintergrundkontrast" AUS.
    - Systemeinstellungen -> Barrierefreiheit bzw. Animationsgeschwindigkeit:
      Animationen auf "Sofort" oder stark verkuerzt.
    - In Noctalia: Visualizer/cava aus, Desktop-Widgets sparsam,
      Wallpaper statisch (kein Video/Slideshow), Blur in der Shell reduzieren.

LITE
fi
