#!/usr/bin/env bash
# The shim attaches interactive agents, but hosts non-TTY and already-jailed agents detached.
set -uo pipefail

MODULE="$(cd "$(dirname "$0")/.." && pwd)"
TESTROOT="$(mktemp -d -t agent-mux-routing.XXXXXX)"
trap 'rm -rf "$TESTROOT"' EXIT

HOME_DIR="$TESTROOT/home"
SHIM_DIR="$HOME_DIR/.claude/bin"
REAL_DIR="$TESTROOT/real"
mkdir -p "$SHIM_DIR" "$HOME_DIR/.claude/lib" "$REAL_DIR" "$TESTROOT/ledger/sessions"
cp "$MODULE/bin/_tmpjail-shim.sh" "$SHIM_DIR/_tmpjail-shim.sh"
cp "$MODULE/lib/shim-guard.sh" "$HOME_DIR/.claude/lib/shim-guard.sh"
ln -s _tmpjail-shim.sh "$SHIM_DIR/probeagent"

cat >"$HOME_DIR/.claude/lib/agent-session-ledger.sh" <<'EOF'
agent_ledger_birth() { printf 'routing-test'; }
agent_ledger_dir() { printf '%s' "$ROUTING_LEDGER"; }
EOF
cat >"$SHIM_DIR/_agent-session-tmux" <<'EOF'
#!/usr/bin/env bash
printf 'attach=%s jailed=%s socket=%s\n' \
  "$AGENT_LEDGER_MUX_ATTACH" "$AGENT_LEDGER_MUX_JAILED" "$AGENT_LEDGER_MUX_SOCKET"
EOF
cat >"$SHIM_DIR/_agent-session-admission" <<'EOF'
#!/usr/bin/env bash
printf 'UNHOSTED\n'
exit 99
EOF
cat >"$REAL_DIR/probeagent" <<'EOF'
#!/usr/bin/env bash
exit 0
EOF
chmod +x "$SHIM_DIR/_tmpjail-shim.sh" "$SHIM_DIR/_agent-session-tmux" \
  "$SHIM_DIR/_agent-session-admission" "$REAL_DIR/probeagent"

run_probe() {
  HOME="$HOME_DIR" ROUTING_LEDGER="$TESTROOT/ledger" \
    PATH="$SHIM_DIR:$REAL_DIR:/usr/bin:/bin" HUMAN_SESSION_RUNTIMES=none \
    env -u TMUX "$@"
}

fail=0
check() {
  if [[ "$2" == "$3" ]]; then
    printf 'ok   %s\n' "$1"
  else
    printf 'FAIL %s (want %q, got %q)\n' "$1" "$3" "$2"
    fail=1
  fi
}

headless="$(run_probe env -u TMPJAIL_ACTIVE -u TERM "$SHIM_DIR/probeagent" </dev/null)"
check "non-TTY launch routes to a detached tmux host" "$headless" \
  "attach=0 jailed=0 socket=$TESTROOT/ledger/sock/routing-test"

jailed="$(run_probe env TMPJAIL_ACTIVE=1 TERM=dumb "$SHIM_DIR/probeagent" </dev/null)"
check "already-jailed launch routes to a detached tmux host" "$jailed" \
  "attach=0 jailed=1 socket=$TESTROOT/ledger/sock/routing-test"

if command -v script >/dev/null 2>&1; then
  interactive="$(run_probe env -u TMPJAIL_ACTIVE TERM=xterm \
    script -qfec "$SHIM_DIR/probeagent" /dev/null | tr -d '\r')"
  check "interactive launch still requests an attached tmux client" "$interactive" \
    "attach=1 jailed=0 socket=$TESTROOT/ledger/sock/routing-test"
else
  printf 'skip interactive routing (script unavailable)\n'
fi

exit "$fail"
