#!/usr/bin/env bash
# Lance l'hote Klipper (klippy) depuis le laptop, avec le printer.cfg du projet.
#
#   ./start-klipper.sh          -> demarre en arriere-plan
#   ./start-klipper.sh stop     -> arrete
#   ./start-klipper.sh restart  -> les deux
#
# Log    : /tmp/klippy.log
# Socket : /tmp/klippy_uds   (utilise par send-gcode.sh)
# PID    : /tmp/klippy.pid
#
# L'arret passe par le fichier PID, JAMAIS par `pkill -f` : le motif finit
# toujours par matcher la ligne de commande du shell courant, qui se tue
# lui-meme (vecu trois fois le 2026-09-04).
set -uo pipefail
cd "$(dirname "$0")"

PIDFILE=/tmp/klippy.pid

stop_it() {
    if [ -f "$PIDFILE" ]; then
        PID=$(cat "$PIDFILE")
        if kill -0 "$PID" 2>/dev/null; then
            kill "$PID"
            for _ in $(seq 1 20); do
                kill -0 "$PID" 2>/dev/null || break
                sleep 0.5
            done
            kill -9 "$PID" 2>/dev/null
            echo "klippy arrete (PID $PID)"
        else
            echo "klippy n'etait pas en cours (PID $PID mort)"
        fi
        rm -f "$PIDFILE"
    else
        echo "pas de $PIDFILE"
    fi
}

start_it() {
    if [ -f "$PIDFILE" ] && kill -0 "$(cat "$PIDFILE")" 2>/dev/null; then
        echo "klippy tourne deja (PID $(cat "$PIDFILE"))"; return 0
    fi
    rm -f /tmp/klippy.log
    klippy-env/bin/python klipper/klippy/klippy.py printer.cfg \
        -l /tmp/klippy.log -a /tmp/klippy_uds > /tmp/klippy-stdout.log 2>&1 &
    echo $! > "$PIDFILE"
    echo "klippy demarre (PID $(cat "$PIDFILE"))"
}

case "${1:-start}" in
    stop)    stop_it ;;
    restart) stop_it; sleep 2; start_it ;;
    start)   start_it ;;
    *)       echo "usage: $0 [start|stop|restart]"; exit 1 ;;
esac
