#!/usr/bin/env bash
# args_json: {"type":"object","required":["action"],"properties":{"action":{"type":"string","description":"get|set|up|down"},"value":{"type":"string","description":"Brightness percentage (for set action)"}}}
# ollie:prompt
# ## gui_brightness
#
# Get/set screen brightness.
#
# - Actions: `get`, `set`, `up`, `down`
#
# ```
# gui_brightness(action="get")
# gui_brightness(action="set", value="50")
# ```
# ollie:end
set -euo pipefail

source "$(dirname "$0")/_lib/args.sh"

SERVICE="org.kde.Solid.PowerManagement"
OBJ_PATH="/org/kde/Solid/PowerManagement/Actions/BrightnessControl"
IFACE="org.kde.Solid.PowerManagement.Actions.BrightnessControl"

cmd=$(arg_require "action")

get_max() {
    gdbus call --session --dest "$SERVICE" \
        --object-path "$OBJ_PATH" \
        --method "$IFACE.brightnessMax" | \
        sed 's/(//;s/,)//'
}

get_current() {
    gdbus call --session --dest "$SERVICE" \
        --object-path "$OBJ_PATH" \
        --method "$IFACE.brightness" | \
        sed 's/(//;s/,)//'
}

case "$cmd" in
    get)
        max=$(get_max)
        cur=$(get_current)
        if [ "$max" -gt 0 ]; then
            pct=$((cur * 100 / max))
        else
            pct=0
        fi
        echo "${pct}%"
        ;;
    set)
        pct=$(arg_require "value")
        max=$(get_max)
        val=$((pct * max / 100))
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.setBrightness" "$val" >/dev/null
        echo "OK: brightness set to ${pct}%"
        ;;
    up)
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.brightnessKeyPressed" "int32:1" >/dev/null 2>&1 || \
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessKeyPressed" "int32:1" >/dev/null
        max=$(get_max); cur=$(get_current)
        echo "OK: brightness now $((cur * 100 / max))%"
        ;;
    down)
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "$IFACE.brightnessKeyPressed" "int32:0" >/dev/null 2>&1 || \
        gdbus call --session --dest "$SERVICE" \
            --object-path "$OBJ_PATH" \
            --method "org.kde.Solid.PowerManagement.Actions.BrightnessControl.brightnessKeyPressed" "int32:0" >/dev/null
        max=$(get_max); cur=$(get_current)
        echo "OK: brightness now $((cur * 100 / max))%"
        ;;
    *)
        echo "error: unknown action: $cmd (use get|set|up|down)" >&2
        exit 1
        ;;
esac
