#!/bin/sh
# Hotplug handler for WAN retry on boot and interface state monitoring

case "$INTERFACE" in
    wan*|wwan*|lte*|modem*)
        case "$ACTION" in
            ifup)
                /etc/init.d/tachyon retry_start_on_wan_up >/dev/null 2>&1 &
                ;;
        esac
        ;;
esac

case "$ACTION" in
    ifup|ifdown) ;;
    *) exit 0 ;;
esac

# 1. Check if interface monitoring is enabled in settings
[ "$(uci -q get tachyon.settings.enable_badwan_interface_monitoring)" = "1" ] || exit 0

# 2. Check if Telegram bot is enabled
[ "$(uci -q get tachyon.telegram.enabled)" = "1" ] || exit 0

# 3. Check if current interface is in badwan_monitored_interfaces (defaults to wan)
MONITORED="$(uci -q get tachyon.settings.badwan_monitored_interfaces)"
[ -n "$MONITORED" ] || MONITORED="wan"

MATCHED=0
for iface in $MONITORED; do
    if [ "$iface" = "$INTERFACE" ]; then
        MATCHED=1
        break
    fi
done
[ "$MATCHED" -eq 1 ] || exit 0

# 4. Handle debounce, state tracking, and notifications in background to avoid blocking hotplug queue
(
    STATE_DIR="/var/run/tachyon"
    mkdir -p "$STATE_DIR" 2>/dev/null
    LOCK_DIR="${STATE_DIR}/wan_monitor_${INTERFACE}.lock"

    # Acquire per-interface lock with stale process check (max 5 seconds)
    acquired=0
    for _ in 1 2 3 4 5; do
        if mkdir "$LOCK_DIR" 2>/dev/null; then
            echo "$$" > "$LOCK_DIR/pid"
            acquired=1
            break
        elif [ -f "$LOCK_DIR/pid" ]; then
            old_pid="$(cat "$LOCK_DIR/pid" 2>/dev/null)"
            if [ -n "$old_pid" ] && ! kill -0 "$old_pid" 2>/dev/null; then
                rm -rf "$LOCK_DIR" 2>/dev/null
                continue
            fi
        fi
        sleep 1
    done
    [ "$acquired" -eq 1 ] || exit 0

    trap 'rm -rf "$LOCK_DIR" 2>/dev/null' EXIT INT TERM

    # Debounce delay to let interface state settle (respects badwan_reload_delay)
    DELAY_MS="$(uci -q get tachyon.settings.badwan_reload_delay)"
    DELAY_SEC=2
    case "$DELAY_MS" in
        ''|*[!0-9]*) DELAY_SEC=2 ;;
        *)
            DELAY_SEC=$((DELAY_MS / 1000))
            [ "$DELAY_SEC" -ge 1 ] 2>/dev/null || DELAY_SEC=1
            ;;
    esac
    sleep "$DELAY_SEC"

    # Query actual interface status from ubus
    STATUS_JSON="$(ubus -S call "network.interface.${INTERFACE}" status 2>/dev/null)"
    CURRENT_STATE="down"
    case "$STATUS_JSON" in
        *'"up": true'*|*'"up":true'*)
            CURRENT_STATE="up"
            ;;
    esac

    STATE_FILE="${STATE_DIR}/wan_state_${INTERFACE}"
    PREV_STATE=""
    [ -f "$STATE_FILE" ] && PREV_STATE="$(cat "$STATE_FILE" 2>/dev/null)"

    TACHYON_BIN="/usr/bin/tachyon"
    [ -x "$TACHYON_BIN" ] || TACHYON_BIN="$(command -v tachyon 2>/dev/null || echo /usr/bin/tachyon)"

    if [ "$CURRENT_STATE" = "up" ]; then
        if [ "$PREV_STATE" = "down" ]; then
            echo "up" > "$STATE_FILE"
            "$TACHYON_BIN" telegram send "🟢 Интерфейс *${INTERFACE}* поднялся!"
        elif [ -z "$PREV_STATE" ]; then
            echo "up" > "$STATE_FILE"
        fi
    elif [ "$CURRENT_STATE" = "down" ]; then
        if [ "$PREV_STATE" = "up" ]; then
            echo "down" > "$STATE_FILE"
            "$TACHYON_BIN" telegram send "⚠️ Интерфейс *${INTERFACE}* упал!"
        elif [ -z "$PREV_STATE" ]; then
            echo "down" > "$STATE_FILE"
        fi
    fi
) >/dev/null 2>&1 &

