#!/bin/bash

# omarchy:summary=Show or adjust Apple Studio Display and Apple XDR Display brightness using asdcontrol.
# omarchy:args=[--no-osd] [+N%|N%-|N%]
# omarchy:examples=omarchy brightness display apple | omarchy brightness display apple +5% | omarchy brightness display apple --no-osd 50%

# Only cache under the user-private runtime dir. With no XDG_RUNTIME_DIR we skip
# caching (detect every run) rather than fall back to a predictable, world-writable
# /tmp path another user could pre-create.
device_cache=""
if [[ -n ${XDG_RUNTIME_DIR:-} ]]; then
  device_cache="$XDG_RUNTIME_DIR/omarchy-brightness-display-apple.device"
fi
no_osd=0
if [[ ${1:-} == "--no-osd" ]]; then
  no_osd=1
  shift
fi

detect_apple_display_device() {
  local devices=()
  local path=""

  for path in /dev/usb/hiddev* /dev/hiddev*; do
    [[ -e $path ]] && devices+=("$path")
  done

  (( ${#devices[@]} > 0 )) || return 1

  sudo asdcontrol --detect "${devices[@]}" 2>/dev/null | awk -F: '/^\/dev\/(usb\/)?hiddev/{ print $1; exit }'
}

find_apple_display_device() {
  local cached=""
  local device=""

  if [[ -n $device_cache && -r $device_cache ]]; then
    read -r cached <"$device_cache" || true
    # Trust a cached value only if it still names a hiddev character device. A
    # stale or unexpected cache (a regular file, a non-hiddev node) is ignored and
    # we re-detect instead of handing an arbitrary path to asdcontrol. The globs
    # are left unquoted on purpose: [[ ]] pattern-matches an unquoted right side,
    # and quoting them would turn the match into a literal string comparison.
    if [[ ( $cached == /dev/hiddev* || $cached == /dev/usb/hiddev* ) && -c $cached ]]; then
      printf '%s\n' "$cached"
      return 0
    fi
  fi

  device="$(detect_apple_display_device)" || return 1
  [[ -n $device ]] || return 1

  if [[ -n $device_cache ]]; then
    printf '%s\n' "$device" >"$device_cache"
  fi
  printf '%s\n' "$device"
}

current_brightness() {
  local device="$1"

  sudo asdcontrol "$device" 2>/dev/null | awk -F= '
    /BRIGHTNESS=/ {
      print int($2 * 100 / 60000)
      found = 1
    }

    END { exit !found }
  '
}

retry_with_fresh_device() {
  rm -f "$device_cache"
  device="$(find_apple_display_device || true)"
  if [[ -z $device ]]; then
    echo "No Apple Display HID device found" >&2
    exit 1
  fi
}

device="$(find_apple_display_device || true)"
if [[ -z $device ]]; then
  echo "No Apple Display HID device found" >&2
  exit 1
fi

if (( $# == 0 )); then
  if current_brightness "$device"; then
    exit
  else
    retry_with_fresh_device
    current_brightness "$device"
    exit
  fi
fi

step="$1"
if [[ $step =~ ^([0-9]+)%-$ ]]; then
  step="-${BASH_REMATCH[1]}%"
fi

if ! sudo asdcontrol "$device" -- "$step" >/dev/null; then
  retry_with_fresh_device
  sudo asdcontrol "$device" -- "$step" >/dev/null
fi

(( no_osd )) || omarchy-osd -i brightness -p "$(current_brightness "$device")"
