# shellcheck shell=dash

___x_cmd log init wifi

___x_cmd_wifi___main(){
    [ $# -gt 0 ]    ||              set -- sum

    local subcmd="$1";              shift
    case "$subcmd" in
        -h|--help)                  ___x_cmd help -m wifi "$@" ; return 0 ;;
        sum)                        ___x_cmd_wifi_sum "$@" ;;
        info)                       ___x_cmd_wifi_info "$@" ;;
        stat)                       ___x_cmd_wifi_stat "$@" ;;
        scan)                       ___x_cmd_wifi_scan "$@" ;;
        connect)                    ___x_cmd_wifi_connect "$@" ;;
        enable)                     ___x_cmd_wifi_enable "$@" ;;
        disable)                    ___x_cmd_wifi_disable "$@" ;;
        prefer)                     ___x_cmd_wifi_prefer "$@" ;;
        *)                          N=wifi M="Unknown subcmd -> $subcmd" log:ret:64 ;;
    esac
}

# ── sum: info + stat ─────────────────────────────────────────────
___x_cmd_wifi_sum(){
    ___x_cmd_wifi_info "$@"
    printf "\n"
    ___x_cmd_wifi_stat "$@"
}

# ── info: WiFi interface hardware info ───────────────────────────
___x_cmd_wifi_info(){
    local simple="" fresh=""
    while [ $# -gt 0 ]; do
        case "$1" in --simple|-s) simple=1; shift ;; --fresh) fresh=1; shift ;; *) break ;; esac
    done
    if ___x_cmd os is darwin; then
        ___x_cmd_wifi_info_macos "$simple" "$fresh"
    elif ___x_cmd os is win; then
        ___x_cmd_wifi_info_win "$simple"
    else
        ___x_cmd_wifi_info_linux "$simple"
    fi
}

___x_cmd_wifi_info_macos(){
    local simple="${1:-}"
    local fresh="${2:-}"
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    local dur="1d"
    [ "$fresh" ] && dur="0s"
    x ccmd "$dur" -- system_profiler SPAirPortDataType 2>/dev/null | ___x_cmd_cmds_awk -v simple="$simple" -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/info_macos.awk"
}

___x_cmd_wifi_info_linux(){
    local simple="${1:-}"
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    # Try /sys/class/wireless first, then iw/iwconfig
    local iface=""
    for d in /sys/class/net/*/wireless; do
        [ -d "$d" ] || continue
        iface="${d%/wireless}"
        iface="${iface##*/}"
        break
    done

    if [ "$iface" ]; then
        local mac="" phy=""
        [ -f "/sys/class/net/$iface/address" ] && read -r mac < "/sys/class/net/$iface/address" 2>/dev/null
        [ -f "/sys/class/net/$iface/phy80211/name" ] && read -r phy < "/sys/class/net/$iface/phy80211/name" 2>/dev/null

        if [ "$tty" ]; then
            printf "\033[1;36m%-25s\033[0m: %s\n" "interface" "$iface"
            [ "$mac" ] && printf "\033[1;36m%-25s\033[0m: %s\n" "MAC address" "$mac"
            [ "$phy" ] && printf "\033[1;32m%-25s\033[0m: %s\n" "PHY" "$phy"
        else
            printf "%-25s: %s\n" "interface" "$iface"
            [ "$mac" ] && printf "%-25s: %s\n" "MAC address" "$mac"
            [ "$phy" ] && printf "%-25s: %s\n" "PHY" "$phy"
        fi

        if ! [ "$simple" ] && ___x_cmd_cmds iw 2>/dev/null; then
            ___x_cmd_cmds iw dev "$iface" info 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/info_linux_iw.awk"
        fi
    elif ___x_cmd_cmds iwconfig 2>/dev/null; then
        ___x_cmd_cmds iwconfig 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/info_linux_iwconfig.awk"
    fi
}

___x_cmd_wifi_info_win(){
    ___x_cmd_cmds netsh wlan show interfaces 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/info_win.awk"
}

# ── stat: all networks table (like disk stat) ────────────────────
___x_cmd_wifi_stat(){
    local fresh=""
    while [ $# -gt 0 ]; do
        case "$1" in --fresh) fresh=1; shift ;; *) break ;; esac
    done
    if ___x_cmd os is darwin; then
        ___x_cmd_wifi_stat_macos "$fresh"
    elif ___x_cmd os is win; then
        ___x_cmd_wifi_stat_win
    else
        ___x_cmd_wifi_stat_linux
    fi
}

___x_cmd_wifi_stat_macos(){
    local fresh="${1:-}"
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    local dur="30s"
    [ "$fresh" ] && dur="0s"
    x ccmd "$dur" -- system_profiler SPAirPortDataType 2>/dev/null | \
        ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/stat_macos.awk"
}

___x_cmd_wifi_stat_linux(){
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    local iface=""
    for d in /sys/class/net/*/wireless; do
        [ -d "$d" ] || continue
        iface="${d%/wireless}"
        iface="${iface##*/}"
        break
    done

    if [ "$iface" ] && ___x_cmd_cmds iw 2>/dev/null; then
        ___x_cmd_cmds iw dev "$iface" link 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/stat_linux_iw.awk"
    elif ___x_cmd_cmds iwconfig 2>/dev/null; then
        ___x_cmd_cmds iwconfig 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/stat_linux_iwconfig.awk"
    fi
}

___x_cmd_wifi_stat_win(){
    ___x_cmd_cmds netsh wlan show interfaces 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/stat_win.awk"
}

# ── scan: nearby networks ────────────────────────────────────────
___x_cmd_wifi_scan(){
    local fresh=""
    while [ $# -gt 0 ]; do
        case "$1" in --fresh) fresh=1; shift ;; *) break ;; esac
    done
    if ___x_cmd os is darwin; then
        ___x_cmd_wifi_scan_macos "$fresh"
    elif ___x_cmd os is win; then
        ___x_cmd_wifi_scan_win
    else
        ___x_cmd_wifi_scan_linux
    fi
}

___x_cmd_wifi_scan_macos(){
    local fresh="${1:-}"
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    # Step 1: Collect preferred networks into temp file
    local tmpfile
    tmpfile="$(mktemp)"
    local device
    device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
    networksetup -listpreferredwirelessnetworks "$device" 2>/dev/null | ___x_cmd_cmds_awk -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/prefer_ls_macos.awk" > "$tmpfile"

    # Step 2: Scan and display in table with "SAVED" column
    local dur="30s"
    [ "$fresh" ] && dur="0s"
    x ccmd "$dur" -- system_profiler SPAirPortDataType 2>/dev/null | \
        ___x_cmd_cmds_awk -v tty="$tty" -v preferfile="$tmpfile" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/scan_macos.awk"
}

___x_cmd_wifi_scan_linux(){
    local tty=""
    ___x_cmd_is_stdout2tty && tty=1

    if ___x_cmd_cmds iw 2>/dev/null; then
        local iface=""
        for d in /sys/class/net/*/wireless; do
            [ -d "$d" ] || continue
            iface="${d%/wireless}"
            iface="${iface##*/}"
            break
        done
        if [ "$iface" ]; then
            ___x_cmd_cmds iw dev "$iface" scan trigger 2>/dev/null
            sleep 2
            ___x_cmd_cmds iw dev "$iface" scan 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/scan_linux.awk"
        fi
    elif ___x_cmd_cmds nmcli 2>/dev/null; then
        ___x_cmd_cmds nmcli -f SSID,SIGNAL,SECURITY,FREQ,CHAN dev wifi list 2>/dev/null
    fi
}

___x_cmd_wifi_scan_win(){
    ___x_cmd_cmds netsh wlan show networks mode=bssid 2>/dev/null
}

# ── connect / enable / disable / prefer ──────────────────────────
___x_cmd_wifi_connect(){
    local ssid="$1"
    local pass="$2"
    [ "$ssid" ] || N=wifi M="Usage: x wifi connect <SSID> [password]" log:ret:64

    if ___x_cmd os is darwin; then
        local device
        device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
        if [ "$pass" ]; then
            networksetup -setairportnetwork "$device" "$ssid" "$pass"
        else
            networksetup -setairportnetwork "$device" "$ssid"
        fi
        printf "Connecting to %s...\n" "$ssid"
    elif ___x_cmd cmds nmcli 2>/dev/null; then
        if [ "$pass" ]; then
            ___x_cmd_cmds nmcli dev wifi connect "$ssid" password "$pass"
        else
            ___x_cmd_cmds nmcli dev wifi connect "$ssid"
        fi
    else
        N=wifi M="connect not supported on this platform" log:ret:64
    fi
}

___x_cmd_wifi_enable(){
    if ___x_cmd os is darwin; then
        local device
        device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
        networksetup -setairportpower "$device" on
    elif ___x_cmd cmds nmcli 2>/dev/null; then
        ___x_cmd_cmds nmcli radio wifi on
    elif ___x_cmd cmds rfkill 2>/dev/null; then
        ___x_cmd_cmds rfkill unblock wifi
    else
        N=wifi M="enable not supported on this platform" log:ret:64
    fi
}

___x_cmd_wifi_disable(){
    if ___x_cmd os is darwin; then
        local device
        device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
        networksetup -setairportpower "$device" off
    elif ___x_cmd cmds nmcli 2>/dev/null; then
        ___x_cmd_cmds nmcli radio wifi off
    elif ___x_cmd cmds rfkill 2>/dev/null; then
        ___x_cmd_cmds rfkill block wifi
    else
        N=wifi M="disable not supported on this platform" log:ret:64
    fi
}

___x_cmd_wifi_prefer(){
    [ $# -gt 0 ] || set -- ls
    local op="$1"; shift
    case "$op" in
        ls|list)
            if ___x_cmd os is darwin; then
                local tty=""
                ___x_cmd_is_stdout2tty && tty=1
                local device
                device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
                local n=0
                n="$(networksetup -listpreferredwirelessnetworks "$device" 2>/dev/null | ___x_cmd_cmds_awk 'NR > 1 { n++ } END { print n + 0 }')"
                if [ "$n" -eq 0 ]; then
                    printf "No preferred networks.\n"
                    return 0
                fi
                if [ "$tty" ]; then printf "\033[1;33m%-4s %s\033[0m\n" "#" "PREFERRED NETWORKS"
                else printf "%-4s %s\n" "#" "PREFERRED NETWORKS"; fi
                networksetup -listpreferredwirelessnetworks "$device" 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/prefer_ls_macos.awk"
            elif ___x_cmd cmds nmcli 2>/dev/null; then
                ___x_cmd_cmds nmcli -t -f NAME,TYPE,DEVICE connection show 2>/dev/null | ___x_cmd_cmds_awk -v tty="$tty" -f "$___X_CMD_ROOT_MOD/wifi/lib/awk/prefer_ls_linux.awk"
            fi
            ;;
        forget)
            local ssid="$1"
            [ "$ssid" ] || N=wifi M="Usage: x wifi prefer forget <SSID>" log:ret:64
            if ___x_cmd os is darwin; then
                local device
                device="$(networksetup -listallhardwareports 2>/dev/null | ___x_cmd_cmds_awk '/Hardware Port: Wi-Fi/{found=1} found && /Device:/{print $2; exit}')"
                networksetup -removepreferredwirelessnetwork "$device" "$ssid"
                printf "Forgot network: %s\n" "$ssid"
            elif ___x_cmd cmds nmcli 2>/dev/null; then
                ___x_cmd_cmds nmcli connection delete "$ssid"
            fi
            ;;
        *)
            N=wifi M="Unknown prefer subcmd -> $op" log:ret:64
            ;;
    esac
}
