#!/bin/bash

# Función para convertir máscara a bits usando bc (binario)
mask_to_bits() {
    local mask=$1
    local total_bits=0
    # Separamos los octetos por el punto
    for octet in $(echo "$mask" | tr '.' ' '); do
        # Convertimos a binario y quitamos los ceros
        # bc devuelve el número binario, luego tr -d '0' borra los ceros
        # y wc -c cuenta cuántos '1' quedan
        bits_en_octeto=$(echo "obase=2; ibase=10; $octet" | bc | tr -d '0' | wc -c)
        # wc -c cuenta el salto de línea, así que restamos 1
        let total_bits+=(bits_en_octeto-1)
    done
    echo "$total_bits"
}

# Obtener nombres de las interfaces
INTERFACES=$(ifconfig -a | grep -E "^[a-z0-9]+" | sed -E 's/^([a-z0-9]+):.*/\1/')

for IFACE in $INTERFACES; do
    echo "Interfaz: $IFACE"

    # 1. Dirección IP (Limpieza total)
    IP=$(ifconfig "$IFACE" | grep "inet " | sed -E 's/.*inet ([0-9.]+) .*/\1/')
    [ -z "$IP" ] && IP="No disponible"
    echo "-> Dirección IP: $IP"

    # 2. Broadcast (Solo la IP de broadcast)
    BROAD=$(ifconfig "$IFACE" | grep "broadcast" | sed -E 's/.*broadcast ([0-9.]+).*/\1/')
    [ -z "$BROAD" ] && BROAD="0.0.0.0"
    echo "-> Broadcast: $BROAD"

    # 3. Máscara de red (Conversión a bits)
    MASK_RAW=$(ifconfig "$IFACE" | grep "netmask" | sed -E 's/.*netmask ([0-9.]+).*/\1/')
    if [ -n "$MASK_RAW" ]; then
        BITS=$(mask_to_bits "$MASK_RAW")
        echo "-> Máscara de red: $BITS bits"
    else
        echo "-> Máscara de red: No disponible"
    fi

    # 4. Cable conectado
    LINK=$(sudo ethtool "$IFACE" 2>/dev/null | grep "Link detected:" | cut -d: -f2 | xargs)
    [ "$LINK" == "yes" ] && LINK_STR="Sí" || LINK_STR="No"
    echo "-> Cable conectado: $LINK_STR"

    # 5. Velocidades (Filtrado específico para modos baseT)
    # Buscamos solo los patrones tipo 10/100/1000baseT
    SUPPORTED=$(sudo ethtool "$IFACE" 2>/dev/null | sed -n '/Supported link modes:/,/Configured/p' | grep -oE "[0-9]+baseT/[A-Za-z]+" | xargs)
    ADVERTISED=$(sudo ethtool "$IFACE" 2>/dev/null | sed -n '/Advertised link modes:/,/Advertised auto-negotiation/p' | grep -oE "[0-9]+baseT/[A-Za-z]+" | xargs)

    [ -z "$SUPPORTED" ] && SUPPORTED="No disponible"
    [ -z "$ADVERTISED" ] && ADVERTISED="No disponible"

    echo "-> Velocidades soportadas: $SUPPORTED"
    echo "-> Velocidades anunciadas como disponibles: $ADVERTISED"
done