#!/bin/sh
. /lib/functions/network.sh
. /lib/functions.sh

EXCLUDE_PROTOS="relay sstp pptp gre l2tp l2tpv3 wireguard mirror vrf"
MWAN_TRACK_DIR="/var/run/mwan3track"
MIN_METRIC=999999
MIN_WANIF=""
INCLUDE_VPN=0
IGNORE_FAILOVER=0

[ "$2" = "--include-vpn" ] || [ "$3" = "--include-vpn" ] && INCLUDE_VPN=1
[ "$2" = "--ignore-failover" ] || [ "$3" = "--ignore-failover" ] && IGNORE_FAILOVER=1

parse_mwan3_wan(){
	local section="$1"

	! echo "$section" | grep -q "_member_mwan" && return

	config_get metric "$section" metric "999999"
	config_get iface "$section" interface ""
	network_get_protocol proto "$iface"
	local is_online=0

	[ "$(cat ${MWAN_TRACK_DIR}/${iface}/STATUS 2>/dev/null)" = "online" ] && is_online=1

	[ $is_online -eq 0 ] || [ "$metric" -gt "$MIN_METRIC" ] || [ -z "$proto" ]  && return
	[ $INCLUDE_VPN -eq 0 ] && [[ "$EXCLUDE_PROTOS" == *"$proto"* ]] && return
	MIN_METRIC="$metric"
	MIN_WANIF="$iface"
}

if ! network_find_wan wanif "" 10; then
	echo "$cfg" "NO_WAN_LINK"
	exit
fi

[ -d "$MWAN_TRACK_DIR" ] && [ $IGNORE_FAILOVER -eq 0 ] && {
	config_load mwan3
	config_foreach parse_mwan3_wan member
}

if [ -z $MIN_WANIF ]; then
	for i in $wanif
	do
		network_get_metric metric "$i"
		network_get_protocol proto "$i"
		[ "$metric" -gt "$MIN_METRIC" ] || [ -z "$proto" ] && continue
		[ $INCLUDE_VPN -eq 0 ] && [[ "$EXCLUDE_PROTOS" == *"$proto"* ]] && continue
		MIN_METRIC="$metric"
		MIN_WANIF="$i"
	done
fi

wanif="$MIN_WANIF"

case "$1" in
	"ip")
		network_get_ipaddrs wanadr "$wanif"
		[ -z "$wanadr" ] && network_get_ipaddrs wanadr "$wanif"_4
		[ -z "$wanadr" ] && network_get_ipaddrs wanadr "$wanif"_6
		echo "$wanadr"
		;;
	"state")
		network_get_device wandev "$wanif"
		case "$wandev" in
			"wwan"* | "rmnet"* | "qmimux"* | "usb"* | "ppp-"*)
				echo "Mobile"
				;;
			"eth"* | "wan"* | "pppoe-"* | *"_to_wan")
				echo "Wired"
				;;
			"wlan"* | "apcli"*)
				echo "WiFi"
				;;
		esac
		;;
	"interface")
		network_get_device wandev "$wanif"
		echo "$wandev"
		;;
	*)
		echo "Usage: wan_info {ip|state|interface} [--include-vpn] [--ignore-failover]"
esac