#!/bin/sh

# Prints all batteries, their percentage remaining and an emoji corresponding
# to charge status (🔌 for plugged up, 🔋 for discharging on battery, etc.).

case $BLOCK_BUTTON in
    3) notify-send "🔋 Battery module" "🔋: discharging
🛑: not charging
🔄;: stagnant charge
🔌: charging
⚡: charged
❗: battery very low!" ;;
esac

# Loop through all attached batteries.
for battery in /sys/class/power_supply/BAT?
do
	# Get its remaining capacity and charge status.
	capacity=$(cat "$battery"/capacity 2>/dev/null)
	if [ -n "$capacity" ]; then
		#do not print misreads
		[ "$capacity" -gt 100 ] &&
			echo "Error. Capacity:$capacity" > /dev/stderr &&
			continue
		# do not display full batteries (nice to unclutter status bars for laptops mostly used stationiary)
		if [ "$capacity" -eq 100 ] || grep -q "Full" "$battery"/status; then
			printf '\n'
			continue
		fi

		# Critical low-battery notification at the "!" level (<=5% and discharging).
		# Notify only once per discharge episode: a flag in /tmp suppresses repeats
		# and is cleared the moment we stop discharging (plug in) or on reboot
		# (since /tmp is wiped), so the next low event notifies again.
		lowflag="/tmp/battery_low_notified_${battery##*/}"
		if grep -q "Discharging" "$battery"/status; then
			if [ "$capacity" -le 5 ] && [ ! -f "$lowflag" ]; then
				notify-send -u critical "❗ Battery critically low" \
					"Battery at ${capacity}%. Plug in the laptop now."
				touch "$lowflag"
			fi
		else
			# Plugged in (charging / not charging / full): arm for the next episode.
			rm -f "$lowflag"
		fi

		unset status
		status=$(sed "s/Not charging/🛑/" "$battery"/status)
		# Center picture around the actual capacity.
		# Displayable capacities: 0, 1/4, 1/2, 3/4, 1 -> intervall of length 25% centered around displaycategory
		# -> +- 12.5% for every level
		if grep -qE "(Discharging|Charging)" "$battery"/status; then
			status=" "
			[ "$capacity" -le 87 ] &&
				status=" "
			[ "$capacity" -le 63 ] &&
				status=" "
			[ "$capacity" -le 37 ] &&
				status=" "
			[ "$capacity" -le 13 ] &&
				status=" "
			[ "$capacity" -le 5 ] &&
				status=" ❗"
			if grep -q "Charging" "$battery"/status; then
				status="${status}🔌"
			fi
		fi
		printf "%s\n" "$status"
	else
		echo "Error. Capacity:$capacity" > /dev/stderr #if battery fails during reading, quit
	fi
done
