#!/usr/bin/env bash
# ---------------------------------------------------------------------------
#  Minimal xrandr multi-monitor switcher.
#    display auto | duplicate | extend | internal | external | list
#  "internal" is whichever output name looks like a laptop panel.
# ---------------------------------------------------------------------------
set -uo pipefail

command -v xrandr >/dev/null || { echo "xrandr not installed" >&2; exit 1; }

mapfile -t CONNECTED < <(xrandr --query | awk '/ connected/{print $1}')
INTERNAL="$(printf '%s\n' "${CONNECTED[@]}" | grep -m1 -E '^(eDP|LVDS|DSI)' || true)"
[[ -z "$INTERNAL" ]] && INTERNAL="${CONNECTED[0]:-}"
mapfile -t EXTERNALS < <(printf '%s\n' "${CONNECTED[@]}" | grep -v "^${INTERNAL}$" || true)

reload_bar() { "$HOME/.config/polybar/launch.sh" >/dev/null 2>&1 & }
restore_bg()  { "$HOME/.local/bin/set-wallpaper" >/dev/null 2>&1 & }

case "${1:-auto}" in
  list)
    xrandr --query | grep -E ' connected|disconnected' ; exit 0 ;;

  internal)
    args=(--output "$INTERNAL" --auto --primary)
    for e in "${EXTERNALS[@]}"; do args+=(--output "$e" --off); done
    xrandr "${args[@]}" ;;

  external)
    if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
    args=(--output "${EXTERNALS[0]}" --auto --primary --output "$INTERNAL" --off)
    for e in "${EXTERNALS[@]:1}"; do args+=(--output "$e" --off); done
    xrandr "${args[@]}" ;;

  duplicate)
    if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
    args=(--output "$INTERNAL" --auto --primary)
    for e in "${EXTERNALS[@]}"; do args+=(--output "$e" --auto --same-as "$INTERNAL"); done
    xrandr "${args[@]}" ;;

  extend)
    if [[ ${#EXTERNALS[@]} -eq 0 ]]; then echo "no external display connected" >&2; exit 1; fi
    args=(--output "$INTERNAL" --auto --primary)
    prev="$INTERNAL"
    for e in "${EXTERNALS[@]}"; do
      args+=(--output "$e" --auto --right-of "$prev")
      prev="$e"
    done
    xrandr "${args[@]}" ;;

  auto)
    # Extend if something external is plugged in, otherwise laptop panel only.
    if [[ ${#EXTERNALS[@]} -gt 0 ]]; then exec "$0" extend; else exec "$0" internal; fi ;;

  *)
    echo "usage: display auto|duplicate|extend|internal|external|list" >&2; exit 2 ;;
esac

sleep 0.5
restore_bg
reload_bar
