#!/bin/sh
# cpu module -- everything the module needs, dispatched by subcommand:
#   cpu.sh                 -> bar text, "NN%"
#   cpu.sh usage "PREFIX"  -> same usage %, with PREFIX prepended (popup row)
#   cpu.sh mem             -> "Mem: used/total" (popup row)
#   cpu.sh cores           -> "Cores: 0:NN% 1:NN% ..." (popup row)
#   cpu.sh menu            -> popup definition, read once at startup (see
#                             README, "Module-declared menus")
mode="${1:-usage}"

case "$mode" in
menu)
	self="$0"
	echo 'popup : hover : buttons'
	echo "popup_info : \"$self usage 'CPU: '\""
	echo "popup_info : \"$self mem\""
	echo "popup_info : \"$self cores\""
	;;
usage)
	prefix="${2:-}"
	# two /proc/stat samples 0.2s apart -- top(1)'s own output is
	# localised and unparseable
	{ grep -m1 '^cpu ' /proc/stat; sleep 0.2; grep -m1 '^cpu ' /proc/stat; } |
		LC_ALL=C awk -v prefix="$prefix" '
			NR==1 { for (i=2;i<=8;i++) t1+=$i; d1=$5+$6 }
			NR==2 {
				for (i=2;i<=8;i++) t2+=$i; d2=$5+$6; d=t2-t1
				printf "%s%d%%\n", prefix, (d>0 ? (1-(d2-d1)/d)*100 : 0)
			}'
	;;
mem)
	LC_ALL=C free -h | awk '/^Mem:/{print "Mem: " $3"/"$2}'
	;;
cores)
	# two /proc/stat samples paired up by position via an awk array --
	# no process substitution, since /bin/sh may be dash
	a=$(grep '^cpu[0-9]' /proc/stat)
	n=$(printf '%s\n' "$a" | wc -l)
	sleep 0.2
	b=$(grep '^cpu[0-9]' /proc/stat)

	printf '%s\n%s\n' "$a" "$b" | LC_ALL=C awk -v n="$n" '
		NR<=n {
			t1[NR]=0; for (i=2;i<=8;i++) t1[NR]+=$i
			d1[NR]=$5+$6; name[NR]=$1
		}
		NR>n {
			j=NR-n; t2=0; for (i=2;i<=8;i++) t2+=$i
			d2=$5+$6; d=t2-t1[j]
			pct=(d>0)?(1-(d2-d1[j])/d)*100:0
			gsub(/cpu/,"",name[j])
			printf "%s:%d%% ", name[j], pct
		}
		BEGIN { printf "Cores: " }
		END   { print "" }'
	;;
esac
