BASH
#!/usr/bin/env bash

SSID1="Vodafone Hotspot"
SSID2="Vodafone Homespot"
INTERFACE="wlan0"
CHECK_URL="http://connectivitycheck.gstatic.com/generate_204"

MAX_FAILS=3
FAIL_COUNT=0

log_msg() {
    echo "$(date '+%Y-%m-%d %H:%M:%S') - [Hotspot-Watchdog] $1"
}

get_current_conn() {
    nmcli -t -f GENERAL.CONNECTION device show "$INTERFACE" 2>/dev/null | cut -d: -f2
}

nmcli_connect() {
    local ssid="$1"
    log_msg "Versuche Verbindung zu '$ssid' ..."
    if nmcli dev wifi connect "$ssid" ifname "$INTERFACE" >/dev/null 2>&1; then
        log_msg "Erfolgreich mit '$ssid' verbunden."
        return 0
    else
        log_msg "FEHLER: Konnte keine Verbindung zu '$ssid' herstellen."
        return 1
    fi
}

force_switch() {
    local current="$1"
    local target=""

    if [[ "$current" == "$SSID1" ]]; then
        target="$SSID2"
    else
        target="$SSID1"
    fi

    log_msg "!!! Verbindung tot. Versuche Wechsel zu '$target' !!!"

    # 1. Erst die Internet-Verbindung herstellen
    nmcli device disconnect "$INTERFACE" >/dev/null 2>&1
    sleep 2

    if nmcli_connect "$target"; then
        # 2. JETZT den Hotspot neu starten, da wlan0 nun auf dem neuen Kanal ist
        log_msg "Verbindung zu '$target' steht. Starte Hotspot-Dienst neu für Kanal-Sync..."
        sudo systemctl restart start_hotspot.service

        sleep 45
        FAIL_COUNT=0
        return
    fi

    log_msg "Wechsel zu '$target' fehlgeschlagen. Versuche Rückkehr zu '$current' ..."
    if nmcli_connect "$current"; then
        sleep 45
        FAIL_COUNT=0
        return
    fi

    log_msg "Weder '$current' noch '$target' erreichbar. Warte 60s und versuche erneut."
    FAIL_COUNT=0
}

try_connect_any() {
    for ssid in "$SSID1" "$SSID2"; do
        nmcli_connect "$ssid" && { sleep 45; return 0; }
        sleep 5
    done
    return 1
}

log_msg "Watchdog gestartet. Überwache '$SSID1' und '$SSID2'..."

while true; do
    CURRENT_CONN=$(get_current_conn)

    if [[ "$CURRENT_CONN" == "$SSID1" || "$CURRENT_CONN" == "$SSID2" ]]; then
        HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" --connect-timeout 6 "$CHECK_URL")

        if [[ "$HTTP_CODE" -eq 204 ]]; then
            if [[ $FAIL_COUNT -gt 0 ]]; then
                log_msg "Verbindung hat sich erholt (HTTP 204)."
            fi
            FAIL_COUNT=0
        else
            ((FAIL_COUNT++))
            log_msg "Erreiche kein Internet (HTTP: $HTTP_CODE). Fehlversuch $FAIL_COUNT/$MAX_FAILS auf '$CURRENT_CONN'"

            if [[ $FAIL_COUNT -ge $MAX_FAILS ]]; then
                force_switch "$CURRENT_CONN"
            fi
        fi
    else
        FAIL_COUNT=0
        # Prüfen ob wlan0 überhaupt ein Profil aktiv hat
        if [[ -z "$CURRENT_CONN" ]]; then
            log_msg "Keine Verbindung auf $INTERFACE. Versuche '$SSID1' oder '$SSID2' ..."
            try_connect_any
        else
            # wlan0 ist mit einem anderen Netz verbunden -> nichts tun
            sleep 10
            continue
        fi
    fi

    sleep 10
done