#!/bin/sh


# Parse arguments
# ------------------------------------------------------------------------------------
BRIGHTNESS_DIR="/sys/class/backlight/*"
SEND_NOTIFICATION=0
URGENCY="normal"
INCREASE=0
DECREASE=0
SET=0
BRIGHTNESS=0

while [ "$1" ]; do
    case "$1" in
        -h | --help)
            cat << EOF
brightness is a cli tool that for displaying or modifying screen brightness.

Options:
-h | --help: Display this message
-n | --notification: Produce a desktop notification with brightness info
-N | --no-notification: Don't produce a desktop notification with brightness info
-u | --urgency [URGENCY]: Pass over notify-send urgency attribute (default: normal)
-i | --increase [BRIGHTNESS]: Increase the brightness by given amount
-d | --decrease [BRIGHTNESS]: Decrease the brightness by given amount
-s | --set [BRIGHTNESS]: Set new brightness level
-p | --path [DIR_PATH]: Path to brightness directory (default: /sys/class/backlight/*)

Valid values:
    URGENCY: low, normal, critical
    DIR_PATH: Valid path to a directory
    BRIGHTNESS:
        specific value - Example: 10
        percentage value - Example: 10%
EOF
            exit 0
            ;;
        -n | --notification)
            SEND_NOTIFICATION=1
            ;;
        -N | --no-notification)
            SEND_NOTIFICATION=0
            ;;
        -u | --urgency)
            URGENCY="$2"
            shift
            ;;
        -i | --increase)
            INCREASE=1
            BRIGHTNESS="$2"
            shift
            ;;
        -d | --decrease)
            DECREASE=1
            BRIGHTNESS="$2"
            shift
            ;;
        -s | --set)
            SET=1
            BRIGHTNESS="$2"
            shift
            ;;
        -p | --path)
            BRIGHTNESS_DIR="$2"
            shift
            ;;
        * ) 
            echo "Unknown argument '$1', use -h or --help for help" 
            exit 1
            ;;
    esac
    shift
done

# Define constants based on parsed arguments
# ------------------------------------------------------------------------------------
BRIGHTNESS_FILE="$BRIGHTNESS_DIR/brightness"
BRIGHTNESS_MAX="$(cat $BRIGHTNESS_DIR/max_brightness)"


# Helper functins
# ------------------------------------------------------------------------------------

# Send brightness level desktop notification, showing the given brightness level
# as progress bar, along with given message.
# $1 - brightness level (number 0-100)
# $2 - message (notification body)
send_brightness_notify() {
    percent_brightness="$1"
    msg="$2"

    notify-send \
        --app-name=brightness \
        --urgency="$URGENCY" \
        -h int:value:$percent_brightness \
        -h string:synchronous:brightness \
        "brightness" "$msg"
}


# Set brightness to given absolute value
# $1 - brightness absolute value
set_brightness() {
    # there should be sudo config allowing this command without password
    echo "$1" | sudo tee $BRIGHTNESS_FILE >/dev/null
}


# Main Logic
# ------------------------------------------------------------------------------------

# Determine the absolute new brightness level
if [ $INCREASE -eq 1 ] || [ $DECREASE -eq 1 ] || [ $SET -eq 1 ]; then
    # If we're dealing with percentages, change to absolutes
    if echo "$BRIGHTNESS" | grep -qE '%$'; then
        numeric=$(echo "$BRIGHTNESS" | sed 's/.$//')
        absolute=$(echo "($BRIGHTNESS_MAX / 100) * $numeric" | bc -l)
        BRIGHTNESS=$(printf "%.0f" $absolute)
    fi

    # Get the new requested absolute brightness
    if [ $SET -eq 1 ]; then
        new_brightness=$BRIGHTNESS
    elif [ $DECREASE -eq 1 ]; then
        cur_brightness=$(cat $BRIGHTNESS_FILE)
        new_brightness=$(($cur_brightness - $BRIGHTNESS))
    else
        cur_brightness=$(cat $BRIGHTNESS_FILE)
        new_brightness=$(($cur_brightness + $BRIGHTNESS))
    fi

    # Ensure we respect max/min boundaries
    if [ $new_brightness -lt 0 ]; then
        new_brightness=0
    elif [ $new_brightness -gt $BRIGHTNESS_MAX ]; then
        new_brightness=$BRIGHTNESS_MAX
    fi

    # Update the brightness
    set_brightness $new_brightness
fi

cur_brightness=$(cat $BRIGHTNESS_FILE)
percent_brightness=$(echo "($cur_brightness / $BRIGHTNESS_MAX) * 100" | bc -l)
percent_brightness_2f=$(printf "%.2f" $percent_brightness)
percent_brightness_rounded=$(printf "%.0f" $percent_brightness)

if [ $SEND_NOTIFICATION -eq 1 ]; then
    send_brightness_notify "$percent_brightness_rounded" "Level: $percent_brightness_rounded"
fi

echo "Brightness: ${percent_brightness_2f}% (absolute: $cur_brightness)"