#!/bin/bash
# ─── G Radio Player — lanzador completo ─────────────────────────────────────

cd "$(dirname "$0")"
BIN="./target/release"
HOME_GRADIO="$HOME/.gradio/data"
PIDDIR="$HOME_GRADIO/tmp/pids"

# URL del relay internet (ver nota equivalente en package-deb.sh)
export GRADIO_RELAY_URL="${GRADIO_RELAY_URL:-wss://relay.gradio.net/ws}"

# Verificar que estén compilados
for b in radio-player comercial-scheduler playlist-refill; do
    if [ ! -f "$BIN/$b" ]; then
        echo "ERROR: $BIN/$b no existe. Ejecuta ./build.sh primero."
        exit 1
    fi
done

mkdir -p "$PIDDIR"

# ── Matar proceso por archivo PID + búsqueda por nombre ──────────────────────
kill_aux() {
    local name="$1"
    local pidfile="$PIDDIR/$name.pid"

    # Matar por PID guardado
    if [ -f "$pidfile" ]; then
        local pid
        pid=$(cat "$pidfile" 2>/dev/null)
        if [ -n "$pid" ] && kill -0 "$pid" 2>/dev/null; then
            echo "   Deteniendo $name (PID $pid)..."
            kill "$pid" 2>/dev/null
            for i in $(seq 1 6); do
                sleep 0.5
                kill -0 "$pid" 2>/dev/null || break
            done
            kill -0 "$pid" 2>/dev/null && kill -9 "$pid" 2>/dev/null
        fi
        rm -f "$pidfile"
    fi

    # Matar cualquier instancia adicional por nombre (por si hay huérfanos)
    pkill -f "target/release/$name" 2>/dev/null
    sleep 0.3
}

# ── Matar instancias previas ──────────────────────────────────────────────────
echo "==> Deteniendo instancias previas (si las hay)..."
kill_aux "comercial-scheduler"
kill_aux "playlist-refill"
sleep 0.5

# ── Crear directorios necesarios ──────────────────────────────────────────────
mkdir -p "$HOME_GRADIO/tmp"
mkdir -p "$HOME_GRADIO/comerciales"
mkdir -p "$HOME_GRADIO/eventos-espera"
mkdir -p "$HOME_GRADIO/eventos"
mkdir -p "$HOME_GRADIO/parrilla"
mkdir -p "$HOME_GRADIO/reporte"
mkdir -p "$HOME/G Radio/inicio-espacio-pub"
mkdir -p "$HOME/G Radio/fin-espacio-pub"

# Migrar archivo device antiguo a gradio.config si existe
DEVICE_FILE="$HOME_GRADIO/tmp/device"
CONFIG_FILE="$HOME_GRADIO/tmp/gradio.config"
if [ -f "$DEVICE_FILE" ] && [ ! -f "$CONFIG_FILE" ]; then
    echo "==> Migrando device → gradio.config..."
    MIX=$(cat "$HOME_GRADIO/mix" 2>/dev/null || echo "3.0")
    paste -d"\n" "$DEVICE_FILE" /dev/null > "$CONFIG_FILE"
    printf "G Radio\n%s\n" "$MIX" >> "$CONFIG_FILE"
    rm -f "$DEVICE_FILE"
fi

# Limpiar listas temporales y playlist (toma la programación de la hora actual)
> "$HOME_GRADIO/tmp/comercialeslist4"
> "$HOME_GRADIO/tmp/eventos-esperalist"
> "$HOME_GRADIO/tmp/eventoslist"
> "$HOME_GRADIO/tmp/playlist4"
echo "==> Listas temporales y playlist limpiadas."

# ── Lanzar auxiliares guardando su PID ───────────────────────────────────────
echo "==> Iniciando comercial-scheduler..."
"$BIN/comercial-scheduler" &
SCHED_PID=$!
echo "$SCHED_PID" > "$PIDDIR/comercial-scheduler.pid"
echo "   PID: $SCHED_PID"

echo "==> Iniciando playlist-refill..."
"$BIN/playlist-refill" &
REFILL_PID=$!
echo "$REFILL_PID" > "$PIDDIR/playlist-refill.pid"
echo "   PID: $REFILL_PID"

# ── Watchdog: verifica cada 30s que los auxiliares siguen vivos ──────────────
watchdog() {
    while true; do
        sleep 30
        # Si la UI ya no existe, salir
        kill -0 "$RADIO_PID" 2>/dev/null || break

        if ! kill -0 "$SCHED_PID" 2>/dev/null; then
            echo "==> WATCHDOG: comercial-scheduler caído, reiniciando..."
            "$BIN/comercial-scheduler" &
            SCHED_PID=$!
            echo "$SCHED_PID" > "$PIDDIR/comercial-scheduler.pid"
        fi

        if ! kill -0 "$REFILL_PID" 2>/dev/null; then
            echo "==> WATCHDOG: playlist-refill caído, reiniciando..."
            "$BIN/playlist-refill" &
            REFILL_PID=$!
            echo "$REFILL_PID" > "$PIDDIR/playlist-refill.pid"
        fi
    done
}

# ── Inhibir suspensión / DPMS en ARM (previene interferencia con el main loop GTK4) ──
# En ARM+Wayland el compositor puede congelar el GLib main loop al apagar la pantalla,
# causando que los detectores de silencio disparen en falso al reanudar.
# Se intenta con systemd-inhibit (funciona en X11 y Wayland); si no está disponible
# se usa xset para deshabilitar DPMS en X11.
if command -v systemd-inhibit &>/dev/null; then
    echo "==> Inhibiendo idle con systemd-inhibit..."
    # Lanzar el player dentro de systemd-inhibit para bloquear el idle del sistema
    RUST_LOG=info systemd-inhibit \
        --what=idle \
        --who="G Radio Player" \
        --why="Reproducción de audio en curso" \
        --mode=block \
        "$BIN/radio-player" &
    RADIO_PID=$!
else
    # Fallback X11: deshabilitar screensaver y DPMS
    xset s off 2>/dev/null || true
    xset -dpms 2>/dev/null || true
    xset s noblank 2>/dev/null || true

    # ── Iniciar UI ──────────────────────────────────────────────────────────────
    echo "==> Iniciando radio-player (UI)..."
    RUST_LOG=info "$BIN/radio-player" &
    RADIO_PID=$!
fi

# Lanzar watchdog en segundo plano
watchdog &
WATCHDOG_PID=$!

# Esperar a que la UI termine
wait "$RADIO_PID"

# ── Limpieza al salir ─────────────────────────────────────────────────────────
echo "==> Cerrando procesos auxiliares..."
kill "$WATCHDOG_PID" 2>/dev/null
kill_aux "comercial-scheduler"
kill_aux "playlist-refill"
rm -f "$PIDDIR/comercial-scheduler.pid" "$PIDDIR/playlist-refill.pid"
echo "==> Terminado."
