#!/usr/bin/env bash
# spawn - create and launch a new P2PTB agent on your local bridge.
#
# Usage:
#   spawn <agent-name>      # e.g.  spawn scout
#   spawn                   # prompts for the name
#
# Walks you through provider + model + API key, scaffolds the agent
# from the harness template, launches it, and waits for it to register
# on the bridge. Each agent gets its own identity, keys, and memory
# collection, all derived from its name.
set -euo pipefail

HARNESS_DIR="${HARNESS_DIR:-$HOME/agents/Agent-Harness}"
P2PTB_HOME="${P2PTB_HOME:-$HOME/.p2ptb}"
BRIDGE="${BRIDGE_URL:-https://localhost:8766}"

if [[ ! -d "$HARNESS_DIR" ]]; then
    echo "spawn: harness not found at $HARNESS_DIR (set HARNESS_DIR=...)." >&2
    exit 1
fi

on_bridge() {  # arg: agent_id ; exit 0 if that agent is on the bridge
    curl -sk "$BRIDGE/agents" 2>/dev/null | python3 -c "
import json, sys
try: d = json.load(sys.stdin)
except Exception: sys.exit(1)
a = d.get('agents', d) if isinstance(d, dict) else d
sys.exit(0 if any(x.get('agent_id') == '$1' for x in a) else 1)" 2>/dev/null
}

# --- name ---
NAME="${1:-}"
if [[ -z "$NAME" ]]; then
    read -rp "Agent name (lowercase, e.g. scout): " NAME
fi
NAME="$(printf '%s' "$NAME" | tr '[:upper:]' '[:lower:]' | tr -d '[:space:]')"
if [[ ! "$NAME" =~ ^[a-z][a-z0-9-]{1,30}$ ]]; then
    echo "spawn: name must be 2-31 chars (a-z 0-9 -), starting with a letter." >&2
    exit 1
fi
if on_bridge "$NAME"; then
    echo "spawn: '$NAME' is already on the bridge. Pick another name." >&2
    exit 1
fi

# --- provider ---
echo
echo "Pick a brain provider for '$NAME':"
echo "  1) OpenAI     (default model: gpt-4o-mini)"
echo "  2) Anthropic  (default model: claude-sonnet-4-6)"
echo "  3) DeepSeek   (default model: deepseek-chat)"
read -rp "Choose 1/2/3 [1]: " P; P="${P:-1}"
case "$P" in
    1) PROVIDER=openai;    DEF_MODEL=gpt-4o-mini;       KEY_ENV=OPENAI_API_KEY ;;
    2) PROVIDER=anthropic; DEF_MODEL=claude-sonnet-4-6; KEY_ENV=ANTHROPIC_API_KEY ;;
    3) PROVIDER=deepseek;  DEF_MODEL=deepseek-chat;     KEY_ENV=DEEPSEEK_API_KEY ;;
    *) echo "spawn: invalid choice '$P'." >&2; exit 1 ;;
esac

# --- model ---
read -rp "Model [$DEF_MODEL]: " MODEL; MODEL="${MODEL:-$DEF_MODEL}"

# --- api key ---
read -rsp "$KEY_ENV: " API_KEY; echo
if [[ -z "$API_KEY" ]]; then
    echo "spawn: an API key is required for $PROVIDER." >&2
    exit 1
fi

# --- optional persona ---
PERSONA=""
read -rp "One-line role/personality (optional): " PERSONA || true

# --- scaffold ---
AGENT_DIR="$HARNESS_DIR/spawned/$NAME"
mkdir -p "$AGENT_DIR/memory"
cd "$AGENT_DIR"
cp "$HARNESS_DIR/templates/agent.toml.example" agent.toml
python3 - "$NAME" "$PROVIDER" "$MODEL" <<'PY'
import sys, re, pathlib
name, provider, model = sys.argv[1], sys.argv[2], sys.argv[3]
p = pathlib.Path("agent.toml"); s = p.read_text()
s = s.replace('agent_id   = "example-agent"', f'agent_id   = "{name}"')
s = re.sub(r'\[brain\]\nmodel           = "claude-sonnet-4-6"',
           f'[brain]\nprovider        = "{provider}"\nmodel           = "{model}"',
           s, count=1)
s = s.replace('collection = "fidus_memory_prod"', f'collection = "{name}_memory"')
s = s.rstrip() + '\n\n[mcp.mnemos]\nenabled = true   # graph memory (mnemos broker)\n'
p.write_text(s)
PY

if [[ -f "$HARNESS_DIR/templates/CLAUDE.md.example" ]]; then
    cp "$HARNESS_DIR/templates/CLAUDE.md.example" CLAUDE.md
else
    printf '# %s\n' "$NAME" > CLAUDE.md
fi
if [[ -f "$HARNESS_DIR/templates/memory/soul.md.example" ]]; then
    cp "$HARNESS_DIR/templates/memory/soul.md.example" memory/soul.md
else
    printf '# %s\n' "$NAME" > memory/soul.md
fi
if [[ -n "$PERSONA" ]]; then
    printf '\n## Role\n%s\n' "$PERSONA" >> memory/soul.md
fi

# --- launch (own identity/keys/state all derive from the agent_id) ---
# Use the harness venv's python so httpx + the rest of the harness deps
# resolve (we run from the agent's dir, not the harness dir).
PY="$HARNESS_DIR/.venv/bin/python"
[[ -x "$PY" ]] || PY=python3
LOG_DIR="$P2PTB_HOME/$NAME"; mkdir -p "$LOG_DIR"
LOG="$LOG_DIR/agent.log"
( cd "$AGENT_DIR" && nohup env "$KEY_ENV=$API_KEY" PYTHONPATH="$HARNESS_DIR" \
    "$PY" -m p2ptb_agent >>"$LOG" 2>&1 & echo $! > "$LOG_DIR/agent.pid" )
echo
echo "Launching $NAME  ($PROVIDER / $MODEL)  pid $(cat "$LOG_DIR/agent.pid")"

# --- wait for it to register on the bridge ---
for _ in $(seq 1 25); do
    if on_bridge "$NAME"; then
        echo
        echo "  $NAME is registered and online."
        echo
        echo "Talk to it:   bridge-cli send $NAME '{\"intent\":\"ping\"}'"
        echo "Watch logs:   tail -f $LOG"
        echo "Spawn more:   spawn <another-name>"
        exit 0
    fi
    sleep 1
done
echo "  $NAME launched but hasn't registered yet. Check the log: $LOG" >&2
exit 1
