#!/usr/bin/env bash

mod_bat () {
  # Customizable configuration constants
  local -r DEFAULT_CNT=1
  local -r DEFAULT_PRE_PLG=$'\u26A1 '
  local -r DEFAULT_PRE_UPLG=$'\u2755 '
  local -r DEFAULT_PRE_UNK='?? '
  local -r DEFAULT_SUF='%'

  local -r cnt="${1:-${DEFAULT_CNT}}"
  local -r pre_plg="${2-${DEFAULT_PRE_PLG}}"
  local -r pre_uplg="${3-${DEFAULT_PRE_UPLG}}"
  local -r pre_unk="${4-${DEFAULT_PRE_UNK}}"
  local -r suf="${5-${DEFAULT_SUF}}"

  local res cap_files cap_file cap stat_file stat

  # Get up to the specified number of battery capacity files
  readarray -d '' cap_files < \
    <(find /sys/class/power_supply/BAT?/capacity -type f -print0 \
    | head -z -n "${cnt}")

  # Get the corresponding status and capacity for each battery
  for cap_file in "${cap_files[@]}"; do
    # Compute the name of the status file
    printf -v stat_file '%s' "$(dirname "${cap_file}")/status";
    # Get the current battery status
    if [[ -r "${stat_file}" ]]; then
      read -r stat < "${stat_file}"
      case "${stat}" in
        Charging|Full)
          printf -v res '%b %b' "${res}" "${pre_plg}"
          ;;
        Discharging)
          printf -v res '%b %b' "${res}" "${pre_uplg}"
          ;;
        *)
          printf -v res '%b %b' "${res}" "${pre_unk}"
          ;;
      esac
    else
      printf -v res '%b %b' "${res}" "${pre_unk}"
    fi

    # Get the current battery capacity
    read -r cap < "${cap_file}"
    printf -v res '%b%3d%b' "${res}" "${cap}" "${suf}"
  done

  # In res, info for each battery is separated by a space, including a
  # leading space before the first battery info, so remove it
  printf '%b' "${res:1}"
}