#!/usr/bin/env bash
# ===========================================================================
#  Ersetzt den Startbildschirm (Plymouth-Thema "pix") durch ein eigenes Logo.
#
#  Aufruf:  sudo /opt/tvwall/scripts/set-splash.sh /pfad/zum/logo.png [--dauer N]
#           sudo /opt/tvwall/scripts/set-splash.sh --zurueck
#
#  Das Logo wird auf die Bildschirmgroesse zentriert auf schwarzem Grund
#  gesetzt - derselbe Hintergrund, den auch der Player verwendet, damit der
#  Uebergang vom Start in die Wiedergabe nicht springt.
#
#  Dasselbe Bild wird ausserdem als Startlogo des Players hinterlegt
#  (BOOT_LOGO). Das ist der zuverlaessige Teil: Viele Fernseher wachen erst
#  auf, wenn mpv den Bildmodus setzt - der Startbildschirm des Systems ist bis
#  dahin gar nicht zu sehen, beim Herunterfahren dagegen schon.
#
#  --dauer N haelt zusaetzlich den System-Startbildschirm bis N Sekunden nach
#  dem Einschalten (0 = aus, Standard 0).
# ===========================================================================
set -euo pipefail

THEME_DIR="/usr/share/plymouth/themes/pix"
SPLASH="$THEME_DIR/splash.png"
BACKUP="$THEME_DIR/splash.original.png"
CONFIG_TXT="/boot/firmware/config.txt"
[[ -f "$CONFIG_TXT" ]] || CONFIG_TXT="/boot/config.txt"
HOLD_BIN="/usr/local/bin/tvwall-splash-hold"
HOLD_UNIT="/etc/systemd/system/tvwall-splash.service"
TVWALL_CONF="/etc/tvwall/tvwall.conf"
BOOT_LOGO="/var/lib/tvwall/boot-logo.png"
DAUER=0

info() { printf '\033[1;36m==>\033[0m %s\n' "$*"; }
ok()   { printf '\033[1;32m  ✓\033[0m %s\n' "$*"; }
warn() { printf '\033[1;33m  !\033[0m %s\n' "$*"; }
die()  { printf '\033[1;31mFehler:\033[0m %s\n' "$*" >&2; exit 1; }

[[ $EUID -eq 0 ]] || die "bitte mit sudo starten:  sudo $0 $*"
[[ -d "$THEME_DIR" ]] || die "Plymouth-Thema 'pix' nicht gefunden ($THEME_DIR)"

# --- Aufrufparameter -------------------------------------------------------
ARGS=()
while [[ $# -gt 0 ]]; do
  case "$1" in
    --dauer)   DAUER="${2:-12}"; shift 2 ;;
    --zurueck) ARGS+=("--zurueck"); shift ;;
    *)         ARGS+=("$1"); shift ;;
  esac
done
set -- "${ARGS[@]+"${ARGS[@]}"}"

# --- zuruecksetzen ---------------------------------------------------------
if [[ "${1:-}" == "--zurueck" ]]; then
  [[ -f "$BACKUP" ]] || die "keine Sicherung gefunden ($BACKUP)"
  cp -f "$BACKUP" "$SPLASH"
  ok "urspruenglicher Startbildschirm wiederhergestellt"
  systemctl disable --now tvwall-splash.service >/dev/null 2>&1 || true
  rm -f "$HOLD_UNIT" "$HOLD_BIN"
  systemctl daemon-reload
  ok "Halten des Startbildes entfernt"
  if [[ -f "$TVWALL_CONF" ]]; then
    sed -i 's|^BOOT_LOGO=.*|BOOT_LOGO=""|' "$TVWALL_CONF"
    systemctl restart tvwall 2>/dev/null || true
    ok "Startlogo des Players abgeschaltet"
  fi
  rm -f "$BOOT_LOGO"
  update-initramfs -u >/dev/null 2>&1 || true
  ok "fertig - beim naechsten Neustart wieder das Original"
  exit 0
fi

LOGO="${1:-}"
[[ -n "$LOGO" && -f "$LOGO" ]] || die "Bilddatei angeben:  sudo $0 /pfad/zum/logo.png"
command -v ffmpeg >/dev/null || die "ffmpeg fehlt:  sudo apt install ffmpeg"

# --- Bildschirmaufloesung ermitteln ---------------------------------------
MODE="$(head -1 /sys/class/drm/*/modes 2>/dev/null | grep -m1 -E '^[0-9]+x[0-9]+' || true)"
W="${MODE%x*}"; H="${MODE#*x}"
if [[ ! "$W" =~ ^[0-9]+$ || ! "$H" =~ ^[0-9]+$ ]]; then
  W=1920; H=1080
  warn "Aufloesung nicht erkannt - nehme ${W}x${H}"
else
  ok "Bildschirm: ${W}x${H}"
fi

# --- Startbild bauen -------------------------------------------------------
info "Baue Startbild aus $(basename "$LOGO")"
LOGO_H=$(( H * 55 / 100 ))          # Logo auf 55 % der Bildhoehe
TMP="$(mktemp -d)"; trap 'rm -rf "$TMP"' EXIT
ffmpeg -v error -y -f lavfi -i "color=c=black:s=${W}x${H}" -i "$LOGO" \
  -filter_complex "[1:v]scale=-1:${LOGO_H}:force_original_aspect_ratio=decrease[logo];\
[0:v][logo]overlay=(W-w)/2:(H-h)/2:format=auto" \
  -frames:v 1 "$TMP/splash.png" || die "ffmpeg konnte das Bild nicht erzeugen"
ok "Startbild erzeugt ($(stat -c %s "$TMP/splash.png") Bytes)"

# --- einsetzen -------------------------------------------------------------
[[ -f "$BACKUP" ]] || { cp -f "$SPLASH" "$BACKUP"; ok "Original gesichert: $BACKUP"; }
install -m 0644 "$TMP/splash.png" "$SPLASH"
ok "eingesetzt: $SPLASH"

# --- Regenbogen-Quadrat der Firmware abschalten ---------------------------
if [[ -w "$CONFIG_TXT" ]] && ! grep -q "^disable_splash=1" "$CONFIG_TXT"; then
  cp -f "$CONFIG_TXT" "$CONFIG_TXT.tvwall-backup"
  printf '\n# von tvwall set-splash.sh: kein Regenbogen-Quadrat beim Einschalten\ndisable_splash=1\n' >> "$CONFIG_TXT"
  ok "disable_splash=1 in $(basename "$CONFIG_TXT") eingetragen"
fi

# --- dasselbe Bild als Startlogo des Players -------------------------------
# Der zuverlaessige Teil: mpv schaltet den Bildschirm ein, also sieht man
# dieses Bild garantiert - unabhaengig davon, wann der Fernseher aufwacht.
if [[ -d "$(dirname "$BOOT_LOGO")" ]]; then
  install -m 0644 "$TMP/splash.png" "$BOOT_LOGO"
  RUN_USER="$(sed -n 's/^RUN_USER="\(.*\)"/\1/p' "$TVWALL_CONF" 2>/dev/null | head -1)"
  [[ -n "${RUN_USER:-}" ]] && chown "$RUN_USER" "$BOOT_LOGO" 2>/dev/null || true
  ok "Startlogo des Players: $BOOT_LOGO"

  if [[ -f "$TVWALL_CONF" ]]; then
    if grep -q "^BOOT_LOGO=" "$TVWALL_CONF"; then
      sed -i "s|^BOOT_LOGO=.*|BOOT_LOGO=\"$BOOT_LOGO\"|" "$TVWALL_CONF"
    else
      printf '\n# Startlogo, von set-splash.sh eingetragen\nBOOT_LOGO="%s"\nBOOT_LOGO_SECONDS="8"\n' \
        "$BOOT_LOGO" >> "$TVWALL_CONF"
    fi
    ok "BOOT_LOGO in $TVWALL_CONF eingetragen"
    systemctl restart tvwall 2>/dev/null && ok "Dienst neu gestartet - das Logo ist sofort zu sehen" || true
  fi
else
  warn "$(dirname "$BOOT_LOGO") fehlt - Startlogo des Players nicht gesetzt"
fi

# --- Startbild stehenlassen, bis die Wiedergabe uebernimmt ----------------
# Ohne das zeigt Plymouth das Logo nur etwa vier Sekunden; viele Fernseher
# sind zu diesem Zeitpunkt noch gar nicht synchronisiert.
if [[ "$DAUER" == "0" ]]; then
  if [[ -f "$HOLD_UNIT" ]]; then
    systemctl disable --now tvwall-splash.service >/dev/null 2>&1 || true
    rm -f "$HOLD_UNIT" "$HOLD_BIN"
    systemctl daemon-reload
    ok "Halten des System-Startbildes entfernt (--dauer 0)"
  fi
elif [[ -x /usr/bin/plymouth ]]; then
  info "System-Startbild bis $DAUER s nach dem Einschalten halten"
  cat > "$HOLD_BIN" <<'HOLD'
#!/bin/sh
# Haelt den Plymouth-Startbildschirm, bis die angegebene Zeit seit dem
# Einschalten erreicht ist, und uebergibt ihn dann an die Wiedergabe.
# --retain-splash laesst das Bild stehen, bis mpv das erste Mal malt - so
# gibt es dazwischen keine schwarze Luecke.
ZIEL="${1:-12}"
UP="$(cut -d. -f1 /proc/uptime)"
[ "$UP" -lt "$ZIEL" ] && sleep $(( ZIEL - UP ))
[ -x /usr/bin/plymouth ] && /usr/bin/plymouth quit --retain-splash
exit 0
HOLD
  chmod 0755 "$HOLD_BIN"

  cat > "$HOLD_UNIT" <<UNIT
# Von tvwall set-splash.sh erzeugt.
[Unit]
Description=Startbild halten, bis die Wiedergabe uebernimmt
After=plymouth-start.service
Before=tvwall.service plymouth-quit.service plymouth-quit-wait.service
ConditionPathExists=/usr/bin/plymouth

[Service]
Type=oneshot
ExecStart=$HOLD_BIN $DAUER
TimeoutStartSec=60
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target
UNIT
  systemctl daemon-reload
  systemctl enable tvwall-splash.service >/dev/null 2>&1
  ok "tvwall-splash.service eingerichtet"
else
  warn "/usr/bin/plymouth fehlt - Startbild laesst sich nicht halten"
fi

# --- Plymouth liest das Bild aus der initramfs ----------------------------
if command -v update-initramfs >/dev/null; then
  info "Aktualisiere initramfs (dauert einen Moment)"
  update-initramfs -u >/dev/null 2>&1 && ok "initramfs aktualisiert" \
    || warn "initramfs liess sich nicht aktualisieren - meist trotzdem in Ordnung"
fi

cat <<EOF

===========================================================================
 Fertig.

   - Der Player zeigt das Logo beim Start 8 Sekunden lang, bevor die
     Playliste beginnt. Das sieht man sicher, weil mpv den Bildschirm
     einschaltet.
   - Beim Herunterfahren zeigt das System denselben Bildschirm.

   sudo reboot

 Anzeigedauer aendern:  BOOT_LOGO_SECONDS in $TVWALL_CONF
 Zurueck zum Original:  sudo $0 --zurueck
===========================================================================
EOF
