#!/bin/bash

show_ip(){
	local output=$1
	ips=()
	interfaces=()
	echo $output
	while read -r line; do
		ip=$(echo "$line" | awk '{print $2}' | cut -d'/' -f1)
		interface=$(echo "$line" | awk '{print $5}')
		ips+=("$ip")
		interfaces+=("$interface")
	done <<< "$output"
	for i in "${!ips[@]}"; do
		echo "${ips[i]} ${interfaces[i]}"
	done

}

ip_cmd='ip address show | grep 10.5'
sender_ip='10.5.1.1/24'
rec_ip='10.5.1.2/24'
rec_ip_no_code='10.5.1.2'
senders=()
recs=()
sender_eths=()
rec_eths=()
losses=()

sender_type="${1:-router}"
receiver_type="${2:-router}"
if [ "$sender_type" = "router" ]; then
	sender_ub=4
else
	sender_ub=3
fi
if [ "$receiver_type" = "router" ]; then
	rec_ub=4
else
	rec_ub=3
fi
for sender in $(seq 1 $sender_ub);
do
	sender_eth_nums=$(ssh $sender_type$sender "ip address show" | grep -c '^.*eth[0-9]:')
	sender_eth_nums=$(($sender_eth_nums-1))
	echo "$sender_type$sender has $sender_eth_nums eths"
	for sender_eth_num in $(seq 1 $sender_eth_nums);
	do
		# turn on the device
		ssh $sender_type$sender "ip link set dev eth$sender_eth_num up"
		ssh $sender_type$sender "ip address add $sender_ip dev eth$sender_eth_num"
		# for receiver in {1..4}
		for receiver in $(seq 1 $rec_ub);
		do
			receiver_eth_nums=$(ssh $receiver_type$receiver "ip address show" | grep -c '^.*eth[0-9]:')
			receiver_eth_nums=$(($receiver_eth_nums-1))
			echo "$receiver_type$receiver has $receiver_eth_nums eths"
			if [ "$sender_type" = "$receiver_type" ]; then
				if [ "$sender" -eq "$receiver" ]; then
					continue
				fi
			fi
			for receiver_eth_num in $(seq 1 $receiver_eth_nums);
			do
				ssh $receiver_type$receiver "ip link set dev eth$receiver_eth_num up"
				ssh $receiver_type$receiver "ip address add $rec_ip dev eth$receiver_eth_num"
				echo "sen $sender_type$sender eth$sender_eth_num ip $sender_ip"
				echo "rec $receiver_type$receiver eth$receiver_eth_num ip $rec_ip"
				ip_output=$(ssh $sender_type$sender $ip_cmd)
				result=$(show_ip "$ip_output")
				echo $result

				# test loss
				loss=$(ssh $sender_type$sender "ping -c 5 -W 2 -I eth$sender_eth_num $rec_ip_no_code | awk -F', ' '/packet loss/ {print \$3}' | awk '{print int(\$1)}'")
				echo $loss
				if [ "$loss" -ne 100 ]; then
					senders+=("$sender")
					recs+=("$receiver")
					sender_eths+=("$sender_eth_num")
					rec_eths+=("$receiver_eth_num")
					losses+=("$loss")
				fi


				ssh $receiver_type$receiver "ip address del 10.5.1.2/24 dev eth$receiver_eth_num"
			done
		done
		ssh $sender_type$sender "ip address del 10.5.1.1/24 dev eth$sender_eth_num"
	done
done

echo "results"

printf "%-10s %-15s %-12s %-15s %-10s\n" "sender #" "sender eth #" "receiver #" "receiver eth #" "losses #"
for i in "${!senders[@]}"; do
    printf "%-10s %-15s %-12s %-15s %-10s\n" "${senders[i]}" "${sender_eths[i]}" "${recs[i]}" "${rec_eths[i]}" "${losses[i]}"
done

# printf "sender #\t sender eth #\t receiver # \t receiver eth # \t losses # \t\n"
# for i in "${!senders[@]}"; do
#  	printf "%s\t%s\t%s\t%s\t%s\n" "${senders[i]}" "${sender_eths[i]}" "${recs[i]}" "${rec_eths[i]}" "${losses[i]}"
# done