#!/bin/bash
# ============================================================================
# auto-wifi-connect.sh — 开机自动连接 WiFi
#
# 优先级：openwrt_5G > kskbl_2.4G
# 扫描可用网络，优先连接 5G 热点，不可用时回退到 2.4G
#
# 退出码：
#   0 — 成功连接
#   1 — NetworkManager 未就绪（超时）
#   2 — 两个热点均不可用
#   3 — 连接失败
# ============================================================================

PRIMARY="openwrt_5G"
FALLBACK="kskbl_2.4G"
WIFI_PASSWORD="11112222"
MAX_WAIT=30          # 最多等 NetworkManager 就绪的秒数
SCAN_WAIT=3          # WiFi 扫描后的等待秒数

log() {
    echo "[auto-wifi] $(date '+%H:%M:%S') $*" | tee /dev/kmsg 2>/dev/null
}

# ── 等待 NetworkManager 就绪 ──
log "等待 NetworkManager 就绪..."
for i in $(seq 1 $MAX_WAIT); do
    state=$(nmcli -t -f STATE general status 2>/dev/null)
    if [ -n "$state" ]; then
        log "NetworkManager 状态: $state"
        break
    fi
    sleep 2
done

if [ -z "$state" ]; then
    log "错误: NetworkManager 在 ${MAX_WAIT}s 内未就绪"
    exit 1
fi

# ── 获取 WiFi 网卡名 ──
WIFI_IFACE=$(nmcli -t -f DEVICE,TYPE device status 2>/dev/null | grep ':wifi$' | cut -d: -f1 | head -1)
if [ -z "$WIFI_IFACE" ]; then
    log "错误: 未找到 WiFi 网卡"
    exit 2
fi
log "WiFi 网卡: $WIFI_IFACE"

# ── 先检查是否已经连接到目标热点 ──
current=$(nmcli -t -f GENERAL.CONNECTION device show "$WIFI_IFACE" 2>/dev/null | cut -d: -f2)
if [ "$current" = "$PRIMARY" ] || [ "$current" = "$FALLBACK" ]; then
    log "已连接到 $current，无须切换"
    exit 0
fi

# ── 扫描 WiFi ──
log "正在扫描 WiFi..."
nmcli device wifi rescan 2>/dev/null
sleep $SCAN_WAIT

# ── 检查 PRIMARY 是否可见 ──
if nmcli -t -f SSID device wifi list 2>/dev/null | grep -qx "$PRIMARY"; then
    TARGET="$PRIMARY"
    log "检测到 $PRIMARY"
else
    TARGET="$FALLBACK"
    log "$PRIMARY 不可用，回退到 $TARGET"
fi

# ── 连接 ──
log "正在连接 $TARGET ..."
if nmcli device wifi connect "$TARGET" password "$WIFI_PASSWORD" ifname "$WIFI_IFACE" 2>&1; then
    log "成功连接到 $TARGET"
    exit 0
else
    log "错误: 无法连接到 $TARGET"
    exit 3
fi
