#!/usr/bin/env bash
set -euo pipefail

if [ "$EUID" -ne 0 ]; then
  echo "You must run this script as root"
  exit 1
fi

BAT=$(echo /sys/class/power_supply/BAT*) # only supports single-battery systems
BAT_STATUS="$BAT/status"
BAT_CAP="$BAT/capacity"
OVERRIDE_FLAG="/tmp/power-monitor-override"

POWER_SAVE_PERCENT=50 # Enter power-save mode if on bat and below this capacity

HAS_PERFORMANCE="$(powerprofilesctl list | grep "performance" || true)" # the || true ignores grep failing with non-zero code

# monitor loop
prev=0
while true; do
  # check if override is set
  if [ -f "$OVERRIDE_FLAG" ]; then
    echo "Override flag set, waiting for release"
    inotifywait -qq "$OVERRIDE_FLAG"
    continue
  fi

  # read the current state
  status="$(cat "$BAT_STATUS")"
  capacity="$(cat "$BAT_CAP")"

  if [[ $status == "Discharging" ]]; then
    if [[ $capacity -le $POWER_SAVE_PERCENT ]]; then
      profile="power-saver"
    else
      profile="balanced"
    fi
  else
    if [[ -n $HAS_PERFORMANCE ]]; then
      profile="performance"
    else
      profile="balanced"
    fi
  fi

  # Set the new profile
  if [[ "$profile" != "$prev" ]]; then
    echo -en "Setting power profile to ${profile}\n"
    powerprofilesctl set $profile
    prev=$profile
  fi

  # wait for changes in status or capacity files
  # i.e. for the next power change event
  inotifywait -qq "$BAT_STATUS" "$BAT_CAP"
done