#!/usr/bin/env bash
#
# bt-brightness - LCD backlight control for ButtonTask.
#
# Usage:
#   bt-brightness status
#   bt-brightness set <0-100>
#
# Invoked through sudo by the web configurator / Qt UI.
# Prefers /sys/class/backlight/backlight; otherwise the first device with
# max_brightness > 0.
set -euo pipefail

err() { echo "bt-brightness: $*" >&2; exit 1; }

BACKLIGHT_ROOT="/sys/class/backlight"

find_device() {
    local d preferred="$BACKLIGHT_ROOT/backlight" max
    if [ -d "$preferred" ] && [ -f "$preferred/max_brightness" ]; then
        max="$(cat "$preferred/max_brightness" 2>/dev/null || echo 0)"
        if [ "$max" -gt 0 ] 2>/dev/null; then
            echo "$preferred"
            return 0
        fi
    fi
    for d in "$BACKLIGHT_ROOT"/*; do
        [ -d "$d" ] || continue
        [ -f "$d/max_brightness" ] || continue
        max="$(cat "$d/max_brightness" 2>/dev/null || echo 0)"
        if [ "$max" -gt 0 ] 2>/dev/null; then
            echo "$d"
            return 0
        fi
    done
    return 1
}

emit_status() {
    local dev="$1" max cur percent
    max="$(cat "$dev/max_brightness")"
    if [ -f "$dev/actual_brightness" ]; then
        cur="$(cat "$dev/actual_brightness")"
    else
        cur="$(cat "$dev/brightness")"
    fi
    if [ "$max" -gt 0 ]; then
        percent=$(( (cur * 100 + max / 2) / max ))
    else
        percent=0
    fi
    [ "$percent" -gt 100 ] && percent=100
    [ "$percent" -lt 0 ] && percent=0
    printf '{"device":"%s","brightness":%s,"max":%s,"percent":%s}\n' \
        "$(basename "$dev")" "$cur" "$max" "$percent"
}

set_percent() {
    local percent="$1" dev max value
    [[ "$percent" =~ ^[0-9]+$ ]] || err "percent must be an integer 0-100"
    [ "$percent" -ge 0 ] && [ "$percent" -le 100 ] || err "percent must be 0-100"
    dev="$(find_device)" || err "no backlight device found"
    max="$(cat "$dev/max_brightness")"
    [ "$max" -gt 0 ] || err "max_brightness is 0"
    value=$(( (percent * max + 50) / 100 ))
    [ "$value" -lt 0 ] && value=0
    [ "$value" -gt "$max" ] && value="$max"
    # Avoid completely blank panel unless explicitly requested as 0.
    printf '%s\n' "$value" > "$dev/brightness"
    emit_status "$dev"
}

cmd_status() {
    local dev
    dev="$(find_device)" || err "no backlight device found"
    emit_status "$dev"
}

case "${1:-}" in
    status) cmd_status ;;
    set) [ "$#" -eq 2 ] || err "usage: bt-brightness set <0-100>"; set_percent "$2" ;;
    *) err "usage: bt-brightness {status|set <0-100>}" ;;
esac
