#!/bin/sh
# MIKE OS panel launcher: Waybar cuando está disponible; Quickshell como
# fallback ligero incluido en el perfil gráfico.
#
# Supervisa el panel en vez de lanzarlo y olvidarse: si Quickshell muere (un
# fallo de QML, un `pkill` de m-apply-settings que no llegó a relanzarlo, un
# cuelgue), la barra reaparece sola en menos de un segundo. Antes, cualquier
# caída dejaba el escritorio sin barra hasta reiniciar la sesión entera.
set -u

CONFIG="${HOME:-/root}/.config/mike/waybar"
SHELL_QML="${HOME:-/root}/.config/mike/quickshell/shell.qml"
mkdir -p "$CONFIG"

# Un reinicio inmediato en bucle quemaría CPU si el panel no arranca nunca
# (por ejemplo, un error de sintaxis en shell.qml). Se corta tras varios
# fallos seguidos y rápidos, dejando la sesión utilizable.
FAILS=0
MAX_FAILS=5

run_panel() {
    if command -v waybar >/dev/null 2>&1; then
        waybar -c "$CONFIG/config.jsonc" -s "$CONFIG/style.css"
        return $?
    fi
    if command -v quickshell >/dev/null 2>&1 && [ -f "$SHELL_QML" ]; then
        quickshell -p "$SHELL_QML"
        return $?
    fi
    return 127
}

while :; do
    START="$(date +%s 2>/dev/null || echo 0)"
    run_panel
    RC=$?

    # 127 = no hay ningún panel instalado: no tiene sentido reintentar.
    if [ "$RC" = "127" ]; then
        echo "m-panel: no hay panel disponible (ni waybar ni quickshell)." >&2
        while :; do sleep 3600; done
    fi

    END="$(date +%s 2>/dev/null || echo 0)"
    if [ "$((END - START))" -ge 10 ]; then
        # Estuvo vivo un rato: fue una caída puntual, no un fallo de arranque.
        FAILS=0
        sleep 1
    else
        FAILS=$((FAILS + 1))
        if [ "$FAILS" -ge "$MAX_FAILS" ]; then
            # Espaciar en vez de rendirse: si el panel no arranca suele ser por
            # un error en shell.qml, y al corregirlo la barra tiene que volver
            # sola. Antes se dejaba de reintentar para siempre y había que
            # reiniciar la sesión entera.
            echo "m-panel: $FAILS fallos seguidos; reintento cada 30 s." >&2
            FAILS=0
            sleep 30
        else
            sleep 1
        fi
    fi
done
