#!/bin/bash

# omarchy:summary=Show or adjust brightness on the focused display.
# omarchy:args=[--no-osd] [--monitor name] [+N%|N%-|N%|off|on]
# omarchy:examples=omarchy brightness display | omarchy brightness display +5% | omarchy brightness display --monitor DP-1 50% | omarchy brightness display off | omarchy brightness display on

no_osd=0
monitor=""

while (( $# > 0 )); do
  case "$1" in
  --no-osd)
    no_osd=1
    shift
    ;;
  --monitor)
    (( $# >= 2 )) || exit 1
    monitor="$2"
    shift 2
    ;;
  *)
    break
    ;;
  esac
done

# Get the brightness of the passed display
backlight_brightness() {
  brightnessctl -d "$1" -m 2>/dev/null | awk -F, '{ gsub("%", "", $4); print $4; found=1 } END{ exit !found }'
}

[[ -n $monitor ]] || monitor="$(omarchy-hyprland-monitor-focused 2>/dev/null || true)"

monitor_is_internal() {
  [[ $monitor =~ ^(eDP|LVDS|DSI)- ]]
}

use_apple_display() {
  omarchy-hyprland-monitor-focused-apple "$monitor"
}

use_ddc_display() {
  [[ -n $monitor ]] && ! monitor_is_internal
}

if (( $# == 0 )); then
  if use_apple_display; then
    omarchy-brightness-display-apple
    exit
  elif use_ddc_display; then
    omarchy-brightness-display-ddc "$monitor"
    exit
  fi

  device="$(omarchy-hw-display)" || exit 1
  backlight_brightness "$device"
  exit
fi

step="$1"

if [[ $step == "off" ]]; then
  hyprctl dispatch 'hl.dsp.dpms({ action = "disable" })' >/dev/null 2>&1
  exit 0
elif [[ $step == "on" ]]; then
  # Skip the dispatch when every active display is already lit: a redundant
  # DPMS enable right after system resume forces another modeset, which blanks
  # the panel for a beat (visible flash at the unlock screen).
  hyprctl monitors -j 2>/dev/null | jq -e '[.[] | select(.disabled == false)] | length > 0 and all(.dpmsStatus)' >/dev/null 2>&1 && exit 0
  hyprctl dispatch 'hl.dsp.dpms({ action = "enable" })' >/dev/null 2>&1
  exit 0
fi

# Drop overlapping brightness key events so concurrent invocations do not race.
# Hardware key repeat present on some devices can otherwise glitch OSD rendering.
exec {lock_fd}>"${XDG_RUNTIME_DIR:-/tmp}/omarchy-brightness-display.lock"
flock -n "$lock_fd" || exit 0

if use_apple_display; then
  if (( no_osd )); then
    omarchy-brightness-display-apple --no-osd "$step"
  else
    omarchy-brightness-display-apple "$step"
  fi
elif use_ddc_display; then
  brightness="$(omarchy-brightness-display-ddc "$monitor" "$step")" || exit 1
  (( no_osd )) || omarchy-osd -i brightness -p "$brightness"
else
  # Current device highlighted
  device="$(omarchy-hw-display)" || exit 1

  # Current brightness percentage
  current=$(backlight_brightness "$device") || exit 1

  # Apply non-uniform step size: 1% steps if at or below 5%, otherwise set an
  # absolute target percentage to avoid raw backlight rounding causing uneven OSD steps.
  if [[ $step == "+5%" ]]; then
    if (( current < 5 )); then
      (( target = current + 1 ))
    else
      (( target = current + 5 ))
    fi

    (( target > 100 )) && target=100
    step="$target%"
  elif [[ $step == "5%-" ]]; then
    if (( current <= 5 )); then
      (( target = current - 1 ))
    else
      (( target = current - 5 ))
    fi

    (( target < 1 )) && target=1
    step="$target%"
  fi

  # Set brightness of the display device.
  brightnessctl -d "$device" set "$step" >/dev/null

  # Show the new brightness in OSD
  (( no_osd )) || omarchy-osd -i brightness -p "$(backlight_brightness "$device")"
fi
