#!/bin/bash

# omarchy:summary=Send an IPC call to omarchy-shell, starting it if not running
# omarchy:hidden=true

if [[ $# -eq 0 || $1 == "-h" || $1 == "--help" ]]; then
  cat <<USAGE
Usage: omarchy-shell-ipc [--if-running] <target> <method> [args...]

Forwards a quickshell ipc call to omarchy-shell. Starts the shell if it
isn't already running, unless --if-running is passed (in which case the
call is silently skipped when no shell instance exists).

Examples:
  omarchy-shell-ipc shell ping
  omarchy-shell-ipc shell summon omarchy.settings "{}"
  omarchy-shell-ipc shell hide omarchy.image-picker
  omarchy-shell-ipc shell listPlugins
  omarchy-shell-ipc shell listShellConfig
  omarchy-shell-ipc shell rescanPlugins
  omarchy-shell-ipc --if-running bar refreshIndicators
  omarchy-shell-ipc image-selector ping
  omarchy-shell-ipc image-selector cancel ""
USAGE
  exit 0
fi

if_running=0
if [[ $1 == "--if-running" ]]; then
  if_running=1
  shift
fi

OMARCHY_PATH="${OMARCHY_PATH:-$HOME/.local/share/omarchy}"
SHELL_DIR="$OMARCHY_PATH/default/quickshell/omarchy-shell"

shell_running() {
  quickshell list -p "$SHELL_DIR" 2>/dev/null | grep -q '^Instance '
}

if (( if_running )); then
  shell_running || exit 0
else
  # Serialize concurrent invocations so two CLI callers don't both spawn the shell
  # when no instance is running yet.
  lockfile="${XDG_RUNTIME_DIR:-/tmp}/omarchy-shell-ipc.lock"
  {
    flock 9
    if ! shell_running; then
      # 9<&- so the spawned shell does not inherit (and keep) the lock fd; the
      # spawned process is long-lived and would otherwise hold the lock for the
      # remainder of the session, deadlocking every subsequent helper invocation.
      setsid uwsm-app -- env OMARCHY_PATH="$OMARCHY_PATH" quickshell -p "$SHELL_DIR" >/dev/null 2>&1 9<&- &
      for _ in 1 2 3 4 5 6 7 8 9 10; do
        sleep 0.2
        shell_running && break
      done
    fi
  } 9>"$lockfile"
fi

exec quickshell ipc -p "$SHELL_DIR" call "$@"
