#!/bin/sh
set -eu

processed_name="processed_mic_output"
raw_name="raw_mic_output"
action="${1:-toggle}"

case "$action" in
  --status|-s)
    action="status"
    ;;
  --help|-h)
    printf 'Usage: %s [--status]\n' "$0"
    exit 0
    ;;
  toggle|"")
    action="toggle"
    ;;
  *)
    printf 'Unknown option: %s\n' "$action" >&2
    exit 2
    ;;
esac

if ! command -v pw-cli >/dev/null 2>&1; then
  printf 'pw-cli not found in PATH.\n' >&2
  exit 1
fi

if ! command -v wpctl >/dev/null 2>&1; then
  printf 'wpctl not found in PATH.\n' >&2
  exit 1
fi

get_node_id() {
  pw-cli info "$1" 2>/dev/null | awk -F' = ' '
    /object.id/ {
      gsub(/"/, "", $2)
      print $2
      exit
    }
  '
}

processed_id="$(get_node_id "$processed_name")"
raw_id="$(get_node_id "$raw_name")"

if [ -z "${processed_id:-}" ] || [ -z "${raw_id:-}" ]; then
  printf 'Unable to resolve "%s" or "%s".\n' "$processed_name" "$raw_name" >&2
  exit 1
fi

default_id="$(
  wpctl status 2>/dev/null | awk '
    $1 == "Sources:" || $2 == "Sources:" { in_sources = 1; next }
    in_sources && ($1 == "Sinks:" || $2 == "Sinks:") { exit }
    in_sources && match($0, /\\* ([0-9]+)\\./, m) { print m[1]; exit }
  '
)"

if [ "$action" = "status" ]; then
  if [ -z "${default_id:-}" ]; then
    printf 'unknown\n'
    exit 1
  fi

  if [ "$default_id" = "$processed_id" ]; then
    printf 'processed\n'
    exit 0
  fi

  if [ "$default_id" = "$raw_id" ]; then
    printf 'raw\n'
    exit 0
  fi

  printf 'other:%s\n' "$default_id"
  exit 0
fi

if [ -z "${default_id:-}" ]; then
  wpctl set-default "$processed_id"
  exit 0
fi

if [ "$default_id" = "$processed_id" ]; then
  wpctl set-default "$raw_id"
else
  wpctl set-default "$processed_id"
fi
