#!/usr/bin/env bash

# Editable settings for sharing/reuse
SSH_HOST="syn"
IPERF_SERVER_BIN="/usr/local/bin/iperf3"
IPERF_CLIENT_BIN="iperf3-darwin"
IPERF_CLIENT_TARGET="Cyberzerk.local"
REMOTE_SERVER_LOG="/tmp/iperf3-server.log"

WIDGET_TARGET="network_perf"
WIDGET_TITLE="LAN Performance"
WIDGET_BG="rgba(18, 116, 117, 1.00)"
WIDGET_FG="rgba(245, 223, 187, 1.00)"

remote_pid="$(ssh "$SSH_HOST" "nohup $IPERF_SERVER_BIN -s -1 >$REMOTE_SERVER_LOG 2>&1 & echo \\$!")"
ssh_status=$?

if [ "$ssh_status" -ne 0 ]; then
	echo "Failed to start remote iperf3 server on $SSH_HOST" >&2
	exit 1
fi

if [ -z "$remote_pid" ]; then
	echo "Remote iperf3 server PID was not returned" >&2
	exit 1
fi

sleep 1

iperf_output="$($IPERF_CLIENT_BIN -c "$IPERF_CLIENT_TARGET" 2>&1)"
iperf_status=$?

ssh "$SSH_HOST" "kill $remote_pid" >/dev/null 2>&1 || true

if [ "$iperf_status" -ne 0 ]; then
	echo "iperf3 client command failed" >&2
	printf '%s\n' "$iperf_output" >&2
	exit 1
fi

mbps="$(printf '%s\n' "$iperf_output" | awk '/sender$/ {for (i = 1; i <= NF; i++) if ($i == "Mbits/sec") {print $(i - 1); exit}}')"

if [ -z "$mbps" ]; then
	mbps="$(printf '%s\n' "$iperf_output" | awk '/receiver$/ {for (i = 1; i <= NF; i++) if ($i == "Mbits/sec") {print $(i - 1); exit}}')"
fi

if [ -z "$mbps" ]; then
	echo "Could not parse total Mbits/sec from iperf output" >&2
	printf '%s\n' "$iperf_output" >&2
	exit 1
fi

printf '%s\n%sMb/s\n%s\n' "$WIDGET_TITLE" "$mbps" "$(date '+%m/%d %H:%M')" |
	terminal-widget --target "$WIDGET_TARGET" --text - --fit-text --bg "$WIDGET_BG" --fg "$WIDGET_FG" >/dev/null 2>&1 || true

printf '%s\n' "$mbps"
