#!/usr/bin/env bash
# description: Spawn a subagent session, submit a prompt, and return immediately. The subagent runs independently; use PeerSubmit for coordination.
# Args: [-name NAME] [-agent A] [-backend B] [-model M] [-cwd DIR] <prompt...>
# Output: structured KV (session, backend, model)
set -euo pipefail

SERVICE="org.ollie.SessionManager"
OBJ="/org/ollie/SessionManager"
IFACE="org.ollie.SessionManager"

die() { printf 'subagent_spawn: %s\n' "$*" >&2; exit 1; }

dbus_call() {
    dbus-send --session --dest=$SERVICE --type=method_call --print-reply \
        $OBJ "$IFACE.$1" "${@:2}" 2>/dev/null
}

dbus_string() {
    dbus_call "$@" | awk -F'"' '/string "/{print $2; exit}'
}

name=; agent=; backend=; model=; cwd=

while [ $# -gt 0 ]; do
    case $1 in
        -name)    name=$2;    shift ;;
        -agent)   agent=$2;   shift ;;
        -backend) backend=$2; shift ;;
        -model)   model=$2;   shift ;;
        -cwd)     cwd=$2;     shift ;;
        --)       shift; break ;;
        -*)       die "unknown flag: $1" ;;
        *)        break ;;
    esac
    shift
done

[ $# -eq 0 ] && die "prompt required"

# Read agent name from stdin if not provided via flag and stdin is piped.
if [ -z "$agent" ] && ! [ -t 0 ]; then
    agent=$(head -1)
fi

name=${name:-$(/bin/date +%s%N)-$$}
# Prefix with parent session ID for global uniqueness.
[ -n "${OLLIE_SESSION_ID:-}" ] && name="${OLLIE_SESSION_ID}__${name}"
cwd=${cwd:-$(pwd)}
agent=${agent:-default}

prompt="[parent_session_id=${OLLIE_SESSION_ID:-}]
[session_id=${name}]
$*"

# Create session via D-Bus
session_id=$(dbus_string CreateSession \
    string:"$cwd" string:"${backend:-}" string:"${model:-}" string:"$agent")

[ -z "$session_id" ] && die "failed to create session"

# Rename to our chosen name
dbus_call RenameSession string:"$session_id" string:"$name" > /dev/null 2>&1

# Submit prompt
dbus_call Submit string:"$session_id" string:"$prompt" > /dev/null 2>&1 || die "failed to submit prompt"

# Clean up JIT agent config now that the server has loaded it.
[[ "${agent:-}" == jit-* ]] && rm -f "$HOME/.config/ollie/agents/${agent}.json" 2>/dev/null || true

# Report resolved values from the live session.
config=$(dbus_string GetConfig string:"$session_id")
resolved_backend=$(printf '%s\n' "$config" | grep -m1 '^backend=' | cut -d= -f2- || echo "${backend:-default}")
resolved_model=$(printf '%s\n' "$config" | grep -m1 '^model=' | cut -d= -f2- || echo "${model:-default}")
printf 'session=%s\nbackend=%s\nmodel=%s\n' "$name" "$resolved_backend" "$resolved_model"
