#!/bin/sh
# SPDX-License-Identifier: AGPL-3.0-only
# Copyright 2022 Sxmo Contributors

# include common definitions
# shellcheck source=scripts/core/sxmo_common.sh
. sxmo_common.sh

gracefulexit() {
	sxmo_log "gracefully exiting (on signal or after error)"
	sxmo_daemons.sh stop network_monitor_device
	trap - INT TERM EXIT
}

trap "gracefulexit" INT TERM EXIT

getdevtype() {
	nmcli -g GENERAL.TYPE device show "$1" 2>/dev/null
}

# Send the initial states to the statusbar
nmcli -g GENERAL.TYPE,GENERAL.DEVICE d show | grep . | while read -r type; do
	read -r name || break
	sxmo_log "$name initializing network tracking"
	sxmo_hook_statusbar.sh network "$type" "$name"
done

# shellcheck disable=2016
sxmo_daemons.sh start network_monitor_device \
	nmcli device monitor | stdbuf -o0 awk '
	{ newstate=$2 }
	/device removed$/ {newstate="disconnected"}
	newstate == "unavailable" {newstate="disconnected"}

	{
		sub(":$", "", $1) # remove trailing colon from device name
		printf "%s\n%s\n", $1, newstate
	}' | while read -r devicename; do
		read -r newstate || break

		devicetype="$(getdevtype "$devicename")"
		case "$newstate" in
			"connected")
				sxmo_log "$devicename up"
				sxmo_hook_network_up.sh "$devicename" "$devicetype"
				sxmo_hook_statusbar.sh network "$devicetype" "$devicename"
				;;
			"disconnected")
				sxmo_log "$devicename down"
				sxmo_hook_network_down.sh "$devicename" "$devicetype"
				sxmo_hook_statusbar.sh network "$devicetype" "$devicename"
				;;
			"deactivating")
				sxmo_hook_network_pre_down.sh "$devicename" "$devicetype"
				sxmo_hook_statusbar.sh network "$devicetype" "$devicename"
				;;
			"connecting")
				sxmo_hook_network_pre_up.sh "$devicename" "$devicetype"
				sxmo_hook_statusbar.sh network "$devicetype" "$devicename"
				;;
			*)
				sxmo_log "$devicename unknown state: $newstate"
				;;
		esac
	done
