#!/usr/bin/env sh
# Brightness control script using xbacklight
# Will use notify-send to create brightness notifications, if dunst is used
# or the notification daemon supports tag stacks, will automatically update
# the same notifications and not create new ones.
#
# inspired from https://gist.github.com/Blaradox/030f06d165a82583ae817ee954438f2e

usage() {
  echo "usage: control-brightness up|down [step], where step can be any int value
or:     control-brightness set target, where target can be an int value 0-100"
}

direction=$1
step=${2:-10}

get_brightness() {
  xbacklight -get | cut -d. -f1
}

send_notification() {
  icon="preferences-system-brightness-lock"
  brightness=$(get_brightness)
  # Make the bar with the special character ─ (it's not dash -)
  # https://en.wikipedia.org/wiki/Box-drawing_character
  bar=$(seq -s "─" $((brightness / 5)) | sed 's/[0-9]//g')
  if type dunstify 1>/dev/null 2>/dev/null; then
    notcmd="dunstify -h string:x-dunst-stack-tag:brightness"
  else
    notcmd="notify-send -h string:x-dunst-stack-tag:brightness"
  fi
  $notcmd -a "changeVolume" -u low -i "$icon" \
    -h int:value:"$brightness" "Brightness: $brightness%
$bar"
}

case $direction in
up)
  xbacklight -inc "$step"
  send_notification
  ;;
down)
  xbacklight -dec "$step"
  send_notification
  ;;
set)
  if [ -z "$step" ]; then
    echo "set option requires target brightness to be specified."
    return 1
  fi
  xbacklight -set "$step"
  send_notification
  ;;
*)
  echo "usage: control-brightness up|down [step], where step can be any int value"
  ;;
esac