#!/bin/sh

. /lib/functions.sh
. /lib/functions/network.sh
. /usr/share/libubox/jshn.sh
. /lib/mwan3/common.sh

MWAN3TRACK_STATUS_DIR="/var/run/mwan3track"

IPS="ipset"
IPT4="iptables -t mangle -w"
IPT6="ip6tables -t mangle -w"

report_connected_v4() {
	local address

	if [ -n "$($IPT4 -S mwan3_connected 2> /dev/null)" ]; then
		for address in $($IPS list mwan3_connected_v4 | tail -n +8); do
			json_add_string "" "${address}"
		done
	fi
}

report_connected_v6() {
	local address

	if [ -n "$($IPT6 -S mwan3_connected 2> /dev/null)" ]; then
		for address in $($IPS list mwan3_connected_v6 | tail -n +8); do
			json_add_string "" "${address}"
		done
	fi
}

get_mwan3_status() {
	local iface="${1}"
	local iface_select="${2}"
	local running="0"
	local age=0
	local pid device time_p time_n

	network_get_device device $1

	if [ "${iface}" = "${iface_select}" ] || [ "${iface_select}" = "" ]; then
		pid="$(pgrep -f "mwan3track $iface $device")"
		if [ "${pid}" != "" ]; then
			running="1"
		fi

		time_p="$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/TIME")"
		[ -z "${time_p}" ] || {
			time_n="$(get_uptime)"
			let age=time_n-time_p
		}

		json_add_object "${iface}"
		json_add_int age "$age"
		json_add_int "score" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/SCORE")"
		json_add_int "lost" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LOST")"
		json_add_int "turn" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/TURN")"
		json_add_string "status" "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/STATUS")"
		json_add_boolean "running" "${running}"
		json_add_array "track_ip"
		for file in $MWAN3TRACK_STATUS_DIR/${iface}/*; do
			track="${file#*/TRACK_}"
			if [ "${track}" != "${file}" ]; then
				json_add_object
				json_add_string ip "${track}"
				json_add_string status "$(cat "${file}")"
				json_add_int latency "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LATENCY_${track}")"
				json_add_int packetloss "$(cat "$MWAN3TRACK_STATUS_DIR/${iface}/LOSS_${track}")"
				json_close_object
			fi
		done
		json_close_array
		json_close_object
	fi
}

main () {

	case "$1" in
		list)
			json_init
			json_add_object "status"
			json_add_string "section" "x"
			json_add_string "interface" "x"
			json_close_object
			json_dump
			;;
		call)
			case "$2" in
			status)
				local section iface
				read input;
				json_load "$input"
				json_get_var section section
				json_get_var iface interface

				config_load mwan3
				json_init
				case "$section" in
					interfaces)
						json_add_object interfaces
						config_foreach get_mwan3_status interface "${iface}"
						json_close_object
						;;
					connected)
						json_add_object connected
						json_add_array ipv4
						report_connected_v4
						json_close_array
						json_add_array ipv6
						report_connected_v6
						json_close_array
						json_close_object
						;;
					*)
						# interfaces
						json_add_object interfaces
						config_foreach get_mwan3_status interface
						json_close_object
						# connected
						json_add_object connected
						json_add_array ipv4
						report_connected_v4
						json_close_array
						json_add_array ipv6
						report_connected_v6
						json_close_array
						json_close_object
						;;
				esac
				json_dump
				;;
			esac
			;;
	esac
}

main "$@"
