#!/usr/bin/env bash
set -uo pipefail

ROOT="${ROOT:-$(cd "$(dirname "$0")/.." && pwd)}"
PASS=0
FAIL=0
TMP="$(mktemp -d "${TMPDIR:-/tmp}/tmpjail-routing-XXXXXX")"
trap 'rm -rf "$TMP"' EXIT

mkdir -p "$TMP/bin" "$TMP/lib" "$TMP/real" "$TMP/home/.claude/lib"
cp "$ROOT/bin/_tmpjail-shim.sh" "$TMP/bin/_tmpjail-shim.sh"
cp "$ROOT/lib/shim-guard.sh" "$TMP/lib/shim-guard.sh"
ln -s _tmpjail-shim.sh "$TMP/bin/claude"
cat >"$TMP/lib/session-class.sh" <<'EOF'
session_is_human() {
  [[ "${TEST_SESSION_CLASS:-agent}" == human ]]
}
EOF
cat >"$TMP/home/.claude/lib/agent-session-ledger.sh" <<'EOF'
agent_ledger_birth() {
  printf '%s|%s\n' "$1" "$2" >>"$TEST_CAPTURE.birth"
  printf routing-ledger
}
agent_ledger_dir() { printf '%s' "$HOME/ledger"; }
EOF
cat >"$TMP/bin/_human-session" <<'EOF'
#!/usr/bin/env bash
printf '%s\n' "$AGENT_LEDGER_HUMAN_TARGET" >>"$TEST_CAPTURE.target"
printf 'human\n'
EOF
cat >"$TMP/bin/_agent-session-admission" <<'EOF'
#!/usr/bin/env bash
printf 'agent\n'
EOF
cat >"$TMP/real/claude" <<'EOF'
#!/usr/bin/env bash
printf 'direct\n'
EOF
chmod +x "$TMP/bin/_tmpjail-shim.sh" "$TMP/bin/_human-session" \
  "$TMP/bin/_agent-session-admission" "$TMP/real/claude"

route() {
  env -i HOME="$TMP/home" PATH="$TMP/bin:$TMP/real:/usr/bin:/bin" \
    TEST_CAPTURE="$TMP/capture" TEST_SESSION_CLASS="$1" AGENT_LEDGER_MUX=0 \
    TMPJAIL_ACTIVE="${2:-}" HUMAN_SESSION_ACTIVE="${3:-}" "$TMP/bin/claude"
}

expect() {
  local name="$1" want="$2" got
  shift 2
  got="$(route "$@")"
  if [[ "$got" == "$want" ]]; then
    PASS=$((PASS + 1))
    printf 'PASS %s\n' "$name"
  else
    FAIL=$((FAIL + 1))
    printf 'FAIL %s: want=%s got=%s\n' "$name" "$want" "$got"
  fi
}

expect "human terminal ignores leaked jail marker" human human 1
expect "nested agent remains admitted" agent agent 1
expect "unmarked human uses protected session" human human
expect "runtime inside human session remains admitted" agent human 1 1

if grep -Fxq "claude|$TMP/home/.local/state/human-session/tmux.sock" "$TMP/capture.birth"; then
  PASS=$((PASS + 1)); printf 'PASS human ledger birth receives the durable tmux socket\n'
else
  FAIL=$((FAIL + 1)); printf 'FAIL human ledger birth receives the durable tmux socket\n'
fi
if grep -Fxq routing-ledger "$TMP/capture.target"; then
  PASS=$((PASS + 1)); printf 'PASS human launcher receives the prebound ledger target\n'
else
  FAIL=$((FAIL + 1)); printf 'FAIL human launcher receives the prebound ledger target\n'
fi

printf '\n%d passed, %d failed\n' "$PASS" "$FAIL"
((FAIL == 0))
