#!/usr/bin/env bash
# Tests dead-advisor-record.mjs (PostToolUse) + dead-advisor-dedupe.mjs (PreToolUse)
# in a sandboxed HOME containing a copy of resolve.sh (hooks shell out to it).
set -euo pipefail
HERE="$(cd "$(dirname "$0")" && pwd)"
REAL_RESOLVE="$(cd "${HERE}/../skills/dead-advisor" && pwd)/resolve.sh"
RECORD="${HERE}/dead-advisor-record.mjs"
DEDUPE="${HERE}/dead-advisor-dedupe.mjs"
pass=0; fail=0
ok()  { pass=$((pass+1)); echo "ok   - $*"; }
bad() { fail=$((fail+1)); echo "FAIL - $*"; }

SANDBOX="$(mktemp -d)"; trap 'rm -rf "$SANDBOX"' EXIT
mkdir -p "${SANDBOX}/.claude/skills/dead-advisor" "${SANDBOX}/.claude/dead-advisor-state"
cp "$REAL_RESOLVE" "${SANDBOX}/.claude/skills/dead-advisor/resolve.sh"
STATE="${SANDBOX}/.claude/dead-advisor-state"
rec() { HOME="$SANDBOX" node "$RECORD"; }
ded() { HOME="$SANDBOX" node "$DEDUPE"; }

# --- recorder (PostToolUse) ---
echo '{"tool_name":"Agent","tool_input":{"subagent_type":"dead-advisor"},"tool_response":"done agentId: a-str-1 (use SendMessage)","session_id":"s1"}' | rec
[ "$(cat "${STATE}/s1.id" 2>/dev/null)" = "a-str-1" ] && ok "record: string response -> agentId saved" || bad "record string: $(cat "${STATE}/s1.id" 2>/dev/null)"

echo '{"tool_name":"Agent","tool_input":{"subagent_type":"dead-advisor"},"tool_response":{"agentId":"a-obj-2"},"session_id":"s2"}' | rec
[ "$(cat "${STATE}/s2.id" 2>/dev/null)" = "a-obj-2" ] && ok "record: object response -> agentId saved" || bad "record object: $(cat "${STATE}/s2.id" 2>/dev/null)"

echo '{"tool_name":"Agent","tool_input":{"subagent_type":"general-purpose"},"tool_response":{"agentId":"a-x"},"session_id":"s3"}' | rec
[ ! -f "${STATE}/s3.id" ] && ok "record: non-dead-advisor -> no write" || bad "record should skip non-dead-advisor"

echo '{"tool_name":"Bash","tool_input":{},"tool_response":"agentId: a-y","session_id":"s4"}' | rec
[ ! -f "${STATE}/s4.id" ] && ok "record: non-Agent tool -> no write" || bad "record should skip non-Agent"

echo '{"tool_name":"Agent","tool_input":{"subagent_type":"dead-advisor"},"tool_response":"no id here","session_id":"s5"}' | rec
[ ! -f "${STATE}/s5.id" ] && ok "record: no agentId in response -> no write" || bad "record should skip when no agentId"

echo 'not json' | rec && ok "record: malformed stdin -> exit 0" || bad "record malformed should exit 0"

# --- dedupe (PreToolUse) ---
out=$(echo '{"tool_name":"Agent","tool_input":{"subagent_type":"dead-advisor"},"session_id":"s1"}' | ded) || true
echo "$out" | grep -q '"permissionDecision":"deny"' && echo "$out" | grep -q "a-str-1" && ok "dedupe: existing agent -> deny naming id" || bad "dedupe deny: [$out]"

out=$(echo '{"tool_name":"Agent","tool_input":{"subagent_type":"dead-advisor"},"session_id":"s-none"}' | ded) || true
[ -z "$out" ] && ok "dedupe: no prior agent -> allow (first spawn)" || bad "dedupe should allow first: [$out]"

out=$(echo '{"tool_name":"Agent","tool_input":{"subagent_type":"general-purpose"},"session_id":"s1"}' | ded) || true
[ -z "$out" ] && ok "dedupe: non-dead-advisor -> allow" || bad "dedupe should allow non-dead-advisor: [$out]"

out=$(echo 'not json' | ded) || true
[ -z "$out" ] && ok "dedupe: malformed stdin -> allow (fail-open)" || bad "dedupe malformed should allow: [$out]"

echo "----"; echo "pass=$pass fail=$fail"
[ "$fail" -eq 0 ]
