#!/usr/bin/env bash
# ===========================================================================
#  Entfernt den Textbildschirm zwischen Startlogo und Wiedergabe.
#
#  Drei Aenderungen:
#    1. Konsolenmeldungen auf tty3 umleiten - tty1 bleibt sauber
#    2. Plymouth wird erst beendet, wenn tvwall startet - und zwar von tvwall
#       selbst, direkt bevor mpv losgeht. Mit --retain-splash bleibt das Logo
#       dabei stehen, bis mpv das erste Mal malt.
#    3. tvwall raeumt tty1 nicht mehr auf (das hat das Bild geloescht),
#       leert aber einmal dessen Textpuffer - sonst taucht Plymouths
#       Statustext wieder auf, sobald die Wiedergabe endet
#
#  Aufruf:  sudo ~/silent-boot.sh            einschalten
#           sudo ~/silent-boot.sh --zurueck  rueckgaengig
# ===========================================================================
set -euo pipefail
CMDLINE="/boot/firmware/cmdline.txt"; [[ -f "$CMDLINE" ]] || CMDLINE="/boot/cmdline.txt"
QUIT_DIR="/etc/systemd/system/plymouth-quit.service.d"
TVWALL_DIR="/etc/systemd/system/tvwall.service.d"
EXTRA=(loglevel=3 logo.nologo vt.global_cursor_default=0 consoleblank=0)

ok()   { printf '\033[1;32m  ✓\033[0m %s\n' "$*"; }
info() { printf '\033[1;36m==>\033[0m %s\n' "$*"; }
die()  { printf '\033[1;31mFehler:\033[0m %s\n' "$*" >&2; exit 1; }
[[ $EUID -eq 0 ]] || die "bitte mit sudo starten"

schreibe_cmdline() {
  local zeile="$1"
  cp -f "$CMDLINE" "$CMDLINE.tvwall-backup"
  printf '%s\n' "$zeile" > "$CMDLINE"
  if [[ "$(grep -c . "$CMDLINE")" != "1" ]] || ! grep -q "root=" "$CMDLINE"; then
    cp -f "$CMDLINE.tvwall-backup" "$CMDLINE"
    die "cmdline.txt sah falsch aus - Sicherung zurueckgespielt"
  fi
}

if [[ "${1:-}" == "--zurueck" ]]; then
  zeile="$(tr -d '\n' < "$CMDLINE")"
  zeile="${zeile//console=tty3/console=tty1}"
  for e in "${EXTRA[@]}"; do zeile="${zeile// $e/}"; done
  schreibe_cmdline "$zeile"
  rm -rf "$QUIT_DIR" "$TVWALL_DIR/silent.conf" /usr/local/bin/tvwall-clear-tty
  systemctl daemon-reload
  ok "rueckgaengig gemacht - bitte neu starten"
  exit 0
fi

# --- 1) Konsole von tty1 wegnehmen ----------------------------------------
info "Konsolenmeldungen auf tty3 umleiten"
zeile="$(tr -d '\n' < "$CMDLINE")"
zeile="${zeile//console=tty1/console=tty3}"
for e in "${EXTRA[@]}"; do
  zeile="${zeile// $e/}"      # doppelte Eintraege vermeiden
  zeile="$zeile $e"
done
schreibe_cmdline "$zeile"
ok "console=tty3 ${EXTRA[*]}"
echo "    ($(grep -c . "$CMDLINE") Zeile, root= vorhanden)"

# --- 2) Logo stehen lassen, bis mpv malt ----------------------------------
info "Plymouth soll das Bild beim Beenden stehen lassen"
install -d -m 0755 "$QUIT_DIR"
cat > "$QUIT_DIR/retain-splash.conf" <<'UNIT'
# Von tvwall silent-boot.sh:
#  - --retain-splash laesst das Startbild auf dem Schirm stehen, bis mpv das
#    erste Mal malt. Ohne das gibt Plymouth den Bildschirm frei und die
#    Textkonsole blitzt auf.
#  - After=tvwall.service: nicht schon beenden, waehrend die Wiedergabe noch
#    startet. tvwall beendet Plymouth selbst, direkt bevor mpv losgeht.
[Unit]
After=tvwall.service

[Service]
ExecStart=
ExecStart=-/usr/bin/plymouth quit --retain-splash
UNIT
ok "$QUIT_DIR/retain-splash.conf"

# --- 3) tvwall soll tty1 nicht mehr loeschen ------------------------------
info "Textpuffer von tty1 leeren"
cat > /usr/local/bin/tvwall-clear-tty <<'CLR'
#!/bin/sh
# Leert den Textpuffer der virtuellen Konsole tty1.
# Plymouth legt dort neben der Grafikausgabe eine Textanzeige an und schreibt
# seine Statuszeilen hinein. Sichtbar wird das erst, wenn die Wiedergabe endet
# und die Konsole ihren Inhalt neu zeichnet - dann steht dort alter Text.
# Wird ausgefuehrt, solange Plymouth den Bildschirm noch im Grafikmodus haelt:
# der Puffer wird geleert, ohne dass davon etwas zu sehen ist.
printf '[3J[2J[H' > /dev/tty1 2>/dev/null
exit 0
CLR
chmod 0755 /usr/local/bin/tvwall-clear-tty
ok "/usr/local/bin/tvwall-clear-tty"

info "tvwall raeumt tty1 nicht mehr auf"
install -d -m 0755 "$TVWALL_DIR"
cat > "$TVWALL_DIR/silent.conf" <<'UNIT'
# Von tvwall silent-boot.sh:
#  - TTYVTDisallocate/setterm haben das stehengelassene Startbild geloescht.
#    Der Bildschirmschoner der Konsole wird jetzt ueber consoleblank=0
#    im Bootparameter abgeschaltet.
#  - ExecStartPre uebergibt den Bildschirm: Plymouth gibt ihn frei (das Bild
#    bleibt dank --retain-splash stehen), direkt danach uebernimmt mpv.
#    Das "+" laesst diesen einen Schritt mit vollen Rechten laufen.
[Service]
TTYVTDisallocate=no
NoNewPrivileges=no
ExecStartPre=
ExecStartPre=+/usr/local/bin/tvwall-clear-tty
ExecStartPre=+/bin/sh -c '/usr/bin/plymouth quit --retain-splash 2>/dev/null || true'
ExecStopPost=+/usr/local/bin/tvwall-clear-tty
UNIT
ok "$TVWALL_DIR/silent.conf"

systemctl daemon-reload
ok "systemd neu eingelesen"

cat <<EOF

===========================================================================
 Jetzt neu starten:  sudo reboot

 Erwartet: Logo erscheint - bleibt stehen - Wiedergabe uebernimmt.
 Kein Text mehr dazwischen.

 Zur Kontrolle danach:
   systemd-analyze critical-chain tvwall.service | head -5
   journalctl -b -o short-monotonic | grep -E "plymouth-quit|starte mpv"
   -> die beiden Zeitpunkte sollten dicht beieinander liegen

 Rueckgaengig:  sudo ~/silent-boot.sh --zurueck && sudo reboot

 Hinweis: Startmeldungen liegen danach auf tty3 (Strg+Alt+F3) und
 weiterhin vollstaendig im Journal:  journalctl -b
===========================================================================
EOF
