#!/bin/bash

# omarchy:summary=Switch between audio outputs while preserving the mute status

sinks=$(timeout 2 pactl -f json list sinks | jq '[.[] | select((.ports | length == 0) or ([.ports[]? | .availability != "not available"] | any))]')
sinks_count=$(jq 'length' <<<"$sinks")

if (( sinks_count == 0 )); then
  omarchy-osd -m "No audio devices found"
  exit 1
fi

current_sink_name=$(timeout 2 pactl get-default-sink)
current_sink_index=$(jq -r --arg name "$current_sink_name" 'map(.name) | index($name)' <<<"$sinks")

if [[ $current_sink_index != "null" ]]; then
  next_sink_index=$(((current_sink_index + 1) % sinks_count))
else
  next_sink_index=0
fi

next_sink=$(jq -c ".[$next_sink_index]" <<<"$sinks")
next_sink_name=$(jq -r '.name' <<<"$next_sink")
next_sink_description=$(jq -r '.description // .properties."device.description" // .name' <<<"$next_sink")
next_sink_volume=$(jq -r '.volume | to_entries[0].value.value_percent | sub("%"; "") | tonumber' <<<"$next_sink")
next_sink_is_muted=$(jq -r '.mute' <<<"$next_sink")

if [[ $next_sink_is_muted == "true" ]] || (( next_sink_volume == 0 )); then
  icon_state="muted"
elif (( next_sink_volume <= 33 )); then
  icon_state="low"
elif (( next_sink_volume <= 66 )); then
  icon_state="medium"
else
  icon_state="high"
fi

if [[ $next_sink_name != $current_sink_name ]]; then
  omarchy-audio-output-set-default "$(jq -r '.index' <<<"$next_sink")" "$next_sink_name"
fi

omarchy-osd -i "volume-${icon_state}" -m "$next_sink_description"
