#!/bin/bash

# -------- VALID IP FILTER -------- #
valid_ip() {
    echo "$1" | awk -F. '
    NF==4 &&
    $1>=0 && $1<=255 &&
    $2>=0 && $2<=255 &&
    $3>=0 && $3<=255 &&
    $4>=0 && $4<=255 {print $0}'
}

is_private() {
    echo "$1" | grep -qE '^(10\.|127\.|192\.168\.|172\.(1[6-9]|2[0-9]|3[0-1])\.)'
}

# -------- GET METHODS -------- #

get_external() {
    for url in \
        https://api.ipify.org \
        https://ifconfig.me \
        https://icanhazip.com \
        https://checkip.amazonaws.com
    do
        ip=$(curl -s "$url" | tr -d '\n')
        valid_ip "$ip"
    done
}

get_route() {
    ip route get 1.1.1.1 2>/dev/null | \
    awk '{for(i=1;i<=NF;i++) if($i=="src") print $(i+1)}'
}

get_interfaces() {
    ip -4 -o addr show | awk '{print $4}' | cut -d/ -f1
}

get_hostname_ip() {
    hostname -I 2>/dev/null | tr ' ' '\n'
}

# -------- COLLECT + CLEAN -------- #

collect_ips() {
    {
        get_external
        get_route
        get_interfaces
        get_hostname_ip
    } | while read ip; do
        valid_ip "$ip"
    done | sort -u
}

# -------- MAIN -------- #

# Default → best IP (route/public)
if [ -z "$1" ]; then
    get_route | head -n1
    exit 0
fi

# -------- ALL -------- #
if [ "$1" == "-all" ]; then
    collect_ips
    exit 0
fi

# -------- MATCH -------- #
if [ "$1" == "-match" ]; then
    IPS=$(collect_ips)

    echo "IPs found:"
    echo "$IPS"
    echo ""

    PUBLIC=""

    for ip in $IPS; do
        if ! is_private "$ip"; then
            PUBLIC="$PUBLIC $ip"
        fi
    done

    PUB_COUNT=$(echo $PUBLIC | wc -w)

    if [ "$PUB_COUNT" -eq 1 ]; then
        echo "Status: OK (Public IP: $PUBLIC)"
    elif [ "$PUB_COUNT" -gt 1 ]; then
        echo "Status: WARNING (Multiple public IPs: $PUBLIC)"
    else
        echo "Status: ERROR (No public IP detected)"
    fi

    exit 0
fi

# -------- HELP -------- #
echo "Usage:"
echo "sh ip            → best IP"
echo "sh ip -all       → all clean IPs"
echo "sh ip -match     → validate IP consistency"