#!/bin/sh
# garde-connexion — filet de sécurité de la fermeture de session (lancé en root
# par p2i-fermer-session, juste avant l'arrêt du bureau).
#
# Normalement l'écran de connexion (SDDM) revient de lui-même quelques secondes
# après la fermeture. Sur certains matériels il ne revient pas et l'écran reste
# noir : ce programme attend, vérifie, et le cas échéant ramène l'écran de
# connexion. Ce qu'il a constaté est noté dans /var/log/p2i-fermeture.log.
[ "$(id -u)" -eq 0 ] || exit 1
uid="${PKEXEC_UID:-}"
journal=/var/log/p2i-fermeture.log
noter() { echo "$(date '+%F %T') $*" >> "$journal"; }

# Se détacher de la session qui se ferme
if [ "${1:-}" != --detache ]; then
    setsid -f "$0" --detache </dev/null >/dev/null 2>&1
    exit 0
fi

# Garder le journal court
[ -f "$journal" ] && [ "$(wc -l < "$journal")" -gt 400 ] && { tail -200 "$journal" > "$journal.tmp"; mv "$journal.tmp" "$journal"; }
noter "fermeture de session demandée (compte ${uid:-?})"

accueil_present() { pgrep -u sddm -f 'sddm-greeter' >/dev/null 2>&1; }
bureau_present() { [ -n "$uid" ] && pgrep -u "$uid" -x 'wayfire|labwc' >/dev/null 2>&1; }

# 1. Le bureau doit s'arrêter (p2i-fermer-session le lui a demandé)
n=0
while bureau_present && [ "$n" -lt 8 ]; do sleep 1; n=$((n + 1)); done
if bureau_present; then
    noter "le bureau ne s'est pas arrêté en 8 s : arrêt forcé"
    pkill -KILL -u "$uid" -x 'wayfire|labwc'
    sleep 1
fi

# 2. L'écran de connexion doit revenir
n=0
while ! accueil_present && [ "$n" -lt 12 ]; do sleep 1; n=$((n + 1)); done

if accueil_present; then
    # Présent : s'assurer qu'il est bien à l'écran (console virtuelle active)
    sleep 2
    for s in $(loginctl list-sessions --no-legend 2>/dev/null | awk '$3 == "sddm" {print $1}'); do
        vt="$(loginctl show-session "$s" -p VTNr --value 2>/dev/null)"
        actif="$(cat /sys/class/tty/tty0/active 2>/dev/null)"
        if [ -n "$vt" ] && [ "$vt" != 0 ] && [ "$actif" != "tty$vt" ]; then
            noter "écran de connexion sur tty$vt mais console active $actif : bascule"
            chvt "$vt" 2>/dev/null
        fi
    done
    noter "écran de connexion revenu après $n s"
    exit 0
fi

# 3. Toujours rien : relancer l'écran de connexion, sauf si quelqu'un d'autre
#    a encore une session graphique ouverte (elle serait fermée).
autres="$(loginctl list-sessions --no-legend 2>/dev/null | awk '$3 != "sddm" {print $1}' | while read -r s; do
    [ "$(loginctl show-session "$s" -p Type --value 2>/dev/null)" = wayland ] &&
    [ "$(loginctl show-session "$s" -p State --value 2>/dev/null)" != closing ] && echo "$s"; done)"
if [ -n "$autres" ]; then
    noter "écran de connexion absent, mais d'autres sessions sont ouvertes ($autres) : rien de fait"
    exit 0
fi
noter "écran de connexion absent après 12 s : relance de SDDM"
journalctl -u sddm -b --no-pager -n 30 2>/dev/null | sed 's/^/    sddm: /' >> "$journal"
systemctl restart sddm
