#!/bin/sh
# ==============================================================================
# m-network - MIKE OS Network Controller
# ==============================================================================
set -eu

# ip e ifconfig viven en /sbin. Al invocar este script desde una sesión que no
# lleva /sbin en el PATH (por ejemplo por SSH), fallaba con "ip: not found" y
# el estado de red salía vacío.
PATH="/sbin:/usr/sbin:$PATH"
export PATH

usage() {
    echo "Uso: m-network <comando> [argumentos]"
    echo ""
    echo "Comandos:"
    echo "  status            Muestra interfaces, IPs y rutas"
    echo "  test              Verifica conectividad y resolución DNS"
    echo "  dhcp [iface]      Solicita IP dinámica por DHCP"
    echo "  static <iface> <ip/mask> <gw> <dns>  Configura IP estática"
    echo "  up <iface>        Levanta una interfaz"
    echo "  down <iface>      Baja una interfaz"
    echo ""
    exit 1
}

# Línea compacta para la barra: tipo, nombre y estado separados por tabulador.
# Se apoya en sysfs en vez de en la salida de "ip", que cambia de formato y
# hay que analizar: aquí interesa un dato estable y barato de leer.
if [ "${1:-}" = "bar" ]; then
    # WiFi conectado, si hay adaptador.
    if command -v iwctl >/dev/null 2>&1; then
        _dev="$(iwctl device list 2>/dev/null | awk '/station/{print $2; exit}')"
        if [ -n "$_dev" ]; then
            _ssid="$(iwctl station "$_dev" show 2>/dev/null \
                     | sed -n 's/.*Connected network[[:space:]]*\(.*[^[:space:]]\)[[:space:]]*$/\1/p' | head -1)"
            if [ -n "$_ssid" ]; then
                printf 'wifi\t%s\tconectado\n' "$_ssid"
                exit 0
            fi
        fi
    fi
    # Cable: primera interfaz distinta de lo que esté operativa.
    for _p in /sys/class/net/*; do
        _n="$(basename "$_p")"
        [ "$_n" = lo ] && continue
        case "$_n" in wl*) continue ;; esac
        if [ "$(cat "$_p/operstate" 2>/dev/null)" = "up" ]; then
            printf 'cable\t%s\tconectado\n' "$_n"
            exit 0
        fi
    done
    printf 'none\t-\tsin red\n'
    exit 0
fi

[ $# -lt 1 ] && usage

detect_iface() {
    requested="${1:-auto}"
    [ "$requested" != auto ] && [ -e "/sys/class/net/$requested" ] && { echo "$requested"; return 0; }
    for path in /sys/class/net/*; do
        [ -e "$path" ] || continue
        name="$(basename "$path")"
        [ "$name" = lo ] && continue
        echo "$name"
        return 0
    done
    return 1
}

CMD="$1"

case "$CMD" in
    status)
        echo "=== [INTERFACES DE RED] ==="
        ip -br addr show || ifconfig -a
        echo ""
        echo "=== [TABLA DE RUTAS] ==="
        ip route show || route -n
        echo ""
        echo "=== [SERVIDORES DNS (/etc/resolv.conf)] ==="
        cat /etc/resolv.conf 2>/dev/null || echo "No configurado"
        ;;
    test)
        echo "Comprobando conectividad de red..."
        if ping -c 1 -W 2 1.1.1.1 >/dev/null 2>&1; then
            echo " [OK] Conectividad IP (1.1.1.1) funcional."
        else
            echo " [FAIL] Sin conexión a 1.1.1.1"
        fi
        if ping -c 1 -W 2 google.com >/dev/null 2>&1; then
            echo " [OK] Resolución DNS (google.com) funcional."
        else
            echo " [WARN] Fallo resolviendo google.com (comprueba DNS)."
        fi
        ;;
    dhcp)
        IFACE="$(detect_iface "${2:-auto}")" || { echo "ERROR: No se detectó una interfaz de red." >&2; exit 1; }
        echo "Solicitando DHCP en $IFACE..."
        ip link set "$IFACE" up
        udhcpc -i "$IFACE" -n -q -s /usr/share/udhcpc/default.script || udhcpc -i "$IFACE" -n -q
        ;;
    static)
        [ $# -lt 5 ] && { echo "Uso: m-network static <iface> <ip/mask> <gw> <dns>"; exit 1; }
        IFACE="$2"
        [ -e "/sys/class/net/$IFACE" ] || { echo "ERROR: La interfaz '$IFACE' no existe." >&2; exit 1; }
        IPMASK="$3"
        GW="$4"
        DNS="$5"
        echo "Configurando $IFACE con $IPMASK (GW: $GW, DNS: $DNS)..."
        ip link set "$IFACE" up
        ip addr flush dev "$IFACE"
        ip addr add "$IPMASK" dev "$IFACE"
        ip route add default via "$GW" dev "$IFACE"
        echo "nameserver $DNS" > /etc/resolv.conf
        echo "Configuración estática aplicada."
        ;;
    up)
        [ -z "${2:-}" ] && usage
        [ -e "/sys/class/net/$2" ] || { echo "ERROR: La interfaz '$2' no existe." >&2; exit 1; }
        ip link set "$2" up
        echo "Interfaz $2 levantada."
        ;;
    down)
        [ -z "${2:-}" ] && usage
        [ -e "/sys/class/net/$2" ] || { echo "ERROR: La interfaz '$2' no existe." >&2; exit 1; }
        ip link set "$2" down
        echo "Interfaz $2 desactivada."
        ;;
    *)
        usage
        ;;
esac
