#!/bin/sh -e
#
#    battery: print the state of the battery
#
#    Copyright (C) 2009 Raphaël Pinson.
#    Copyright (C) 2011-2014 Dustin Kirkland
#
#    Authors: Raphaël Pinson <raphink@ubuntu.com>
#             Dustin Kirkland <kirkland@byobu.org>
#
#    This program is free software: you can redistribute it and/or modify
#    it under the terms of the GNU General Public License as published by
#    the Free Software Foundation, version 3 of the License.
#
#    This program is distributed in the hope that it will be useful,
#    but WITHOUT ANY WARRANTY; without even the implied warranty of
#    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
#    GNU General Public License for more details.
#
#    You should have received a copy of the GNU General Public License
#    along with this program.  If not, see <http://www.gnu.org/licenses/>.

__battery_detail() {
	local bat
	if [ "$BYOBU_OSTYPE" = "OpenBSD" ]; then
		apm 2>/dev/null || true
		return
	fi
	for bat in /proc/acpi/battery/*; do
		cat "$bat/info"
		cat "$bat/state"
	done
	# FIXME: do the same thing with the /sys interface
	if eval $BYOBU_TEST /usr/bin/upower >/dev/null 2>&1; then
		dev=$(upower -e | grep devices/ups | head -1)
		[ -n "$dev" ] && upower -i "$dev"
	fi
}

__battery() {
	local bat line present sign state percent full rem color bcolor dev BATTERY_STATUS
	# Linux support
	present=""; full="0"; rem="0"; state=""
	# OpenBSD support via apm(8)
	if [ "$BYOBU_OSTYPE" = "OpenBSD" ] && eval $BYOBU_TEST apm >/dev/null 2>&1; then
		local apm_pct apm_ac
		apm_pct=$(apm -l 2>/dev/null)
		apm_ac=$(apm -a 2>/dev/null)
		if [ -n "$apm_pct" ] && [ "$apm_pct" != "255" ]; then
			rem="$apm_pct"
			full="100"
			present="1"
			case "$apm_ac" in
				0) state="discharging" ;;
				1) state="charging" ;;
				2) state="charged" ;;
				*) state="unknown" ;;
			esac
		fi
	fi
	if [ -z "$present" ]; then
	for bat in $BATTERY /sys/class/power_supply/* /proc/acpi/battery/*; do
		case "$bat" in
			/sys/*)
				if [ -r "$bat/uevent" ]; then
					TMP_FILE=$(mktemp) || continue
					trap 'rm -f "$TMP_FILE"' EXIT INT TERM
					sed 's/=/="/; s/$/"/' < "$bat/uevent" > "$TMP_FILE"
					. "$TMP_FILE"
					rm -f "$TMP_FILE"
					trap - EXIT INT TERM
					case "$POWER_SUPPLY_NAME" in AC|ac|Ac|aC) continue ;; esac
					present="$POWER_SUPPLY_PRESENT"
					# Some use "CHARGE", others use "ENERGY", still others "CAPACITY"
					[ -n "$POWER_SUPPLY_CHARGE_FULL" ] && full=$((POWER_SUPPLY_CHARGE_FULL+full))
					[ -n "$POWER_SUPPLY_ENERGY_FULL" ] && full=$((POWER_SUPPLY_ENERGY_FULL+full))
					[ -n "$POWER_SUPPLY_CHARGE_NOW" ] && rem=$((POWER_SUPPLY_CHARGE_NOW+rem))
					[ -n "$POWER_SUPPLY_ENERGY_NOW" ] && rem=$((POWER_SUPPLY_ENERGY_NOW+rem))
					if [ -n "$POWER_SUPPLY_CAPACITY" ] && [ ! -n "$POWER_SUPPLY_ENERGY_NOW" ] && [ ! -n "$POWER_SUPPLY_CHARGE_NOW" ]; then
						rem="$POWER_SUPPLY_CAPACITY" && full="100"
					fi
					[ "$POWER_SUPPLY_STATUS" != "Unknown" ] && state="$POWER_SUPPLY_STATUS"
				fi
			;;
			/proc/*)
				[ -f "$bat/info" ] || continue
				while read line; do
					set -- ${line}
					case "$line" in
						present:*)
							# make sure that this battery is present
							[ "$2" = "no" ] && continue 2
							present="$2";;
					   	last\ full\ capacity:*) full="$4";;
					esac
					[ -n "$present" -a -n "$full" ] && break
				done < "${bat}/info"
				while read line; do
					set -- ${line}
					case "$line" in
						remaining\ capacity:*) rem="$3";;
						charging\ state:*) state="$3";;
					esac
					[ -n "$rem" -a -n "$state" ] && break
				done < "$bat/state"
				[ -n "$full" ] && [ -n "$rem" ] && [ -n "$state" ] && break
			;;
		esac
	done
	# upower fallback if /proc and /sys didn't work, e.g., with an APC UPS via USB HID
	if [ $full -eq 0 ] && [ $rem -eq 0 ] && [ -z "$present" ] && [ -z "$state" ]; then
		if eval $BYOBU_TEST /usr/bin/upower >/dev/null 2>&1; then
			dev=$(upower -e | grep devices/ups | head -1)
			if [ -n "$dev" ]; then
				BATTERY_STATUS=$(upower -i "$dev")
				full="100"
				present=$(printf "%s" "$BATTERY_STATUS" | awk '/present/ { print $2}')
				rem=$(printf "%s" "$BATTERY_STATUS" | awk '/percentage/ { gsub(/[^0-9]/, "", $2); print $2}')
				state=$(printf "%s" "$BATTERY_STATUS" | awk '/state/ { print $2}')
			fi
		fi
	fi
	# Mac OS X support
	if eval $BYOBU_TEST /usr/sbin/ioreg >/dev/null 2>&1; then
		# MacOS support
		local key
		for key in CurrentCapacity MaxCapacity ExternalChargeCapable FullyCharged; do
			line=$(/usr/sbin/ioreg -n AppleSmartBattery -w0 | grep -w $key | sed -e 's/|//g' | awk '{ print $3 }')
			case "$key" in
				CurrentCapacity) rem="$line";;
				MaxCapacity) full="$line";;
				ExternalChargeCapable)
					if [ "${line}" = "Yes" ]; then
						state="charging"
					elif [ "${line}" = "No" ]; then
						state="discharging"
					fi
				;;
				FullyCharged)
					if [ "${line}" = "Yes" ]; then
						state="charged"
					fi
				;;
			esac
		done
	fi
	fi  # end non-OpenBSD block
	# Android Termux support
	if eval $BYOBU_TEST termux-battery-status -h >/dev/null 2>&1; then
		BATTERY_STATUS=$(termux-battery-status)
		full=100
		rem=$(printf "%s" "$BATTERY_STATUS" | awk '/percentage/ { gsub(/[,]/,""); print $2}')
		state=$(printf "%s" "$BATTERY_STATUS" | awk '/status/ { gsub(/[",]/,""); print $2}')
	fi
	if [ $rem -ge 0 ] && [ $full -gt 0 ]; then
		percent=$(((100*$rem)/$full))
		if [ "$percent" -lt 33 ]; then
			color="R w"
			bcolor="b R w"
		elif [ "$percent" -lt 67 ]; then
			color="Y k"
			bcolor="b Y k"
		else
			color="G k"
			bcolor="b G k"
		fi
		percent="${percent}${PCT}"
		# Convert state to lower case
		state=$(printf "%s" "$state" | $BYOBU_SED 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/')
		case $state in
			charging) sign="+" ;;
			discharging) sign="-" ;;
			charged|unknown|full|fully-charged) sign="=" ;;
			*) sign="$state" ;;
		esac
		if [ -z "$percent" ]; then
			rm -f "$BYOBU_RUN_DIR/status.$BYOBU_BACKEND/battery"*
			return
		fi
		color $bcolor; printf "%s" "$percent"; color -; color $color; printf "%s" "$sign"; color --
	fi
}

# vi: syntax=sh ts=4 noexpandtab
