#!/usr/bin/env bash
#
# onx-system-network-info — `ip a`, `ip route`, `/etc/resolv.conf` parse + JSON.
#
# Output: {"interfaces":[...], "default_route":"...", "dns_servers":[...]}

set -euo pipefail

if ! command -v ip &>/dev/null; then
    jq -nc '{ok:false,error:"iproute2 not installed"}' >&2
    exit 2
fi

# Default gateway
default_route="$(ip route show default 2>/dev/null | head -1 | awk '{print $3}' || echo '')"

# DNS servers from /etc/resolv.conf
dns_list="[]"
if [[ -r /etc/resolv.conf ]]; then
    dns_list="$(awk '/^nameserver/ {print $2}' /etc/resolv.conf | jq -R -s 'split("\n") | map(select(length > 0))' 2>/dev/null || echo '[]')"
fi

# Parse interfaces
interfaces_json="["
first=1

while IFS= read -r line; do
    [[ "$line" =~ ^[0-9]+: ]] || continue
    iface=$(echo "$line" | awk -F': ' '{print $2}' | awk -F'@' '{print $1}')
    [[ -z "$iface" ]] && continue

    state=$(echo "$line" | grep -oE 'state [A-Z]+' | head -1 | awk '{print tolower($2)}' || echo "unknown")
    mtu=$(echo "$line" | grep -oE 'mtu [0-9]+' | head -1 | awk '{print $2}' || echo "0")

    # Parse link/ether MAC and IP addresses for this interface
    detail=$(ip -o addr show "$iface" 2>/dev/null || echo "")
    mac=$(ip link show "$iface" 2>/dev/null | grep -oE 'link/[a-z]+ [0-9a-f:]+' | head -1 | awk '{print $2}' || echo "")
    ipv4=$(echo "$detail" | awk '/inet [0-9]/ {print $4}' | head -1 | awk -F/ '{print $1}' || echo "")
    ipv6=$(echo "$detail" | awk '/inet6 [^f]/ {print $4}' | head -1 | awk -F/ '{print $1}' || echo "")
    netmask_cidr=$(echo "$detail" | awk '/inet [0-9]/ {print $4}' | head -1 | awk -F/ '{print $2}' || echo "")

    # Convert CIDR to netmask
    netmask=""
    if [[ -n "$netmask_cidr" && "$netmask_cidr" =~ ^[0-9]+$ ]]; then
        full_mask=$((0xFFFFFFFF << (32 - netmask_cidr)))
        netmask="$(printf '%d.%d.%d.%d' \
            $((full_mask >> 24 & 0xFF)) $((full_mask >> 16 & 0xFF)) \
            $((full_mask >> 8 & 0xFF)) $((full_mask & 0xFF)))"
    fi

    # Default gateway only on the primary interface
    gateway=""
    if [[ -n "$default_route" ]]; then
        primary_iface="$(ip route show default 2>/dev/null | head -1 | grep -oE 'dev [a-z0-9]+' | awk '{print $2}' || echo '')"
        if [[ "$iface" == "$primary_iface" ]]; then
            gateway="$default_route"
        fi
    fi

    # RX/TX counters from /sys/class/net
    rx_bytes=0
    tx_bytes=0
    if [[ -r "/sys/class/net/$iface/statistics/rx_bytes" ]]; then
        rx_bytes=$(cat "/sys/class/net/$iface/statistics/rx_bytes" 2>/dev/null || echo 0)
        tx_bytes=$(cat "/sys/class/net/$iface/statistics/tx_bytes" 2>/dev/null || echo 0)
    fi

    [[ $first -eq 0 ]] && interfaces_json+=","
    first=0
    interfaces_json+="$(jq -nc \
        --arg name "$iface" --arg state "$state" \
        --arg mac "$mac" --arg ipv4 "$ipv4" --arg ipv6 "$ipv6" \
        --arg netmask "$netmask" --arg gateway "$gateway" \
        --argjson mtu "$mtu" \
        --argjson rx_bytes "$rx_bytes" --argjson tx_bytes "$tx_bytes" \
        '{name:$name, state:$state, mac:$mac, ipv4:$ipv4, ipv6:$ipv6, netmask:$netmask, gateway:$gateway, mtu:$mtu, rx_bytes:$rx_bytes, tx_bytes:$tx_bytes}')"
done < <(ip -o link show 2>/dev/null || echo "")

interfaces_json+="]"

jq -nc \
    --argjson interfaces "$interfaces_json" \
    --arg default_route "$default_route" \
    --argjson dns_servers "$dns_list" \
    '{ok:true, interfaces:$interfaces, default_route:$default_route, dns_servers:$dns_servers}'
