#!/bin/bash

DANGER_TEXT="Battery status: DANGER."
CRITICAL_TEXT="Battery status: CRITICAL!"

TIMER=5
CHARGING_TIMER=10
SAFE_TIMER=5
DANGER_TIMER=2
CRITICAL_TIMER=1

SAFE=30
DANGER=15
CRITICAL=5

CRITICAL_HIBERNATE=1

BAR_PID=0
export DISPLAY=:0.0

function launch_nagbar()
{
  echo "Launching i3-nagbar";

  if [ "$1" == "danger" ]; then
      text="${DANGER_TEXT}"
  fi

  if [ "$1" == "critical" ]; then
    text="${CRITICAL_TEXT}"
  fi

  text="${text} ($2%)"
  i3-nagbar -m "$text" -b 'Suspend' 'systemctl suspend' -b 'Hibernate!' 'systemctl hibernate' -b 'Shutdown!' 'systemctl poweroff' > /dev/null 2>&1 &
  BAR_PID=$!
  echo "New BAR_PID: ${BAR_PID}";
}

function kill_nagbar()
{
  if [[ $BAR_PID -ne 0 ]]; then
    ps -p $BAR_PID | grep "i3-nagbar"
    if [[ $? -eq 0 ]]; then
      echo "Killing i3-nagbar";
      kill $BAR_PID
    fi
    BAR_PID=0
  fi
}

while [[ true ]]; do
  kill_nagbar

  if [[ -n $(acpi -b | grep -i discharging) ]]; then

    remaining=$(acpi -b | grep -Eo "[0-9]+%" | grep -Eo "[0-9]+")

    echo "Remaining battery: ${remaining}%";

    if [[ $remaining -gt $SAFE ]]; then
      echo "Battery status: SAFE";
      TIMER=${SAFE_TIMER}
    else
      echo "Battery status: NOT_SAFE";
      TIMER=${DANGER_TIMER}

      if [[ $remaining -le $CRITICAL ]]; then
        echo "Battery status: CRITICAL";
        TIMER=${CRITICAL_TIMER}
        if [[ $CRITICAL_HIBERNATE ]]; then
          echo "[CRITICAL] Hibernating system...";
          systemctl hibernate
          if [[ $? ]]; then
            echo "Hibernating failed (no swap allocated?). Suspending instead";
            systemctl suspend
          fi
        else
          launch_nagbar "critical" $remaining
        fi
      elif [[ $remaining -le $DANGER ]]; then
        echo "Battery status: DANGER";
        launch_nagbar "danger" $remaining
      fi
    fi
  else
    echo "Battery status: Charging";
    TIMER=${CHARGING_TIMER}
  fi

  echo "Sleeping: ${TIMER}m";
  sleep ${TIMER}m
done
