#!/bin/bash
GREEN='\033[1;32m'
CYAN='\033[1;36m'
RESET='\033[0m'
declare -A iface_ips
declare -a iface_order
while read -r iface addr; do
    ip_only=$(echo "$addr" | cut -d'/' -f1)
    if [[ -z "${iface_ips[$iface]}" ]]; then
        iface_order+=("$iface")
    fi
    iface_ips[$iface]+="$ip_only"$'\n'
done < <(ip -o -4 addr show | awk '$2 != "lo" {print $2, $4}')
# Build plain output lines to calculate box width
lines=()
for iface in "${iface_order[@]}"; do
    count=$(echo "${iface_ips[$iface]}" | grep -c '[0-9]')
    speed=$(ethtool "$iface" 2>/dev/null | grep "Speed" | cut -d: -f2 | xargs)
    link=$(ethtool "$iface" 2>/dev/null | grep "Link detected" | cut -d: -f2 | xargs)
    if [ -n "$speed" ]; then
        lines+=("  ${iface}: (${count} IP$([ "$count" -ne 1 ] && echo s))  Speed: ${speed}  Link: ${link}")
    else
        lines+=("  ${iface}: (${count} IP$([ "$count" -ne 1 ] && echo s))")
    fi
    while IFS= read -r ip; do
        [[ -z "$ip" ]] && continue
        lines+=("    ${ip}")
    done <<< "${iface_ips[$iface]}"
    lines+=("")
done
# Find longest line
TITLE="  NETWORK INTERFACE ADDRESSES"
max=${#TITLE}
for line in "${lines[@]}"; do
    len=${#line}
    (( len > max )) && max=$len
done
width=$(( max + 2 ))
# Box drawing using printf
hline() { printf '═%.0s' $(seq 1 $width); }
echo ""
printf "${CYAN}╔%s╗${RESET}\n" "$(hline)"
printf "${CYAN}║${RESET}%-${width}s${CYAN}║${RESET}\n" "$TITLE"
printf "${CYAN}╚%s╝${RESET}\n" "$(hline)"
for line in "${lines[@]}"; do
    pad=$(( width - ${#line} ))
    padding=$(printf '%*s' "$pad" '')
    if [[ "$line" == *: ]]; then
        printf "${CYAN}║${RESET}${GREEN}%s${RESET}%s${CYAN}║${RESET}\n" "$line" "$padding"
    elif [[ -z "$line" ]]; then
        printf "${CYAN}║%-${width}s║${RESET}\n" ""
    else
        printf "${CYAN}║${RESET}${CYAN}%s${RESET}%s${CYAN}║${RESET}\n" "$line" "$padding"
    fi
done
printf "${CYAN}╔%s╗${RESET}\n" "$(hline)"
echo ""
