#!/bin/bash
# Interactive agent picker for the CHL project.
# Run this in a terminal; it lists available agents, asks which one to scope the
# session to, then exec's `claude` with a kickoff prompt that loads the agent.
#
# Usage:
#   bin/chl                    # interactive picker
#   bin/chl <agent-name>       # direct launch
#   bin/chl --list             # just list agents and exit
#
# Tip: alias chl="$PWD/bin/chl" in your shell config to invoke from anywhere.

set -euo pipefail

PROJECT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)"
AGENTS_DIR="$PROJECT_DIR/.claude/agents"

# Discover agents — each .md in .claude/agents/ except _template and README
AGENTS=()
DESCS=()
DOMAINS=()
for f in "$AGENTS_DIR"/*.md; do
    [ -e "$f" ] || continue
    name=$(basename "$f" .md)
    [ "$name" = "_template" ] && continue
    [ "$name" = "README" ] && continue
    AGENTS+=("$name")
    # Pull description from YAML frontmatter (first ~120 chars after "description:")
    desc=$(awk '/^description:/{sub(/^description: */,""); print; exit}' "$f" | cut -c1-120)
    DESCS+=("$desc")
    # Domain: first non-empty line after "# Domain"
    domain=$(awk '/^# Domain[[:space:]]*$/{flag=1; next} flag && NF{print; exit}' "$f" | cut -c1-80)
    DOMAINS+=("$domain")
done

if [ ${#AGENTS[@]} -eq 0 ]; then
    echo "No agents found in $AGENTS_DIR" >&2
    exit 1
fi

# --list: dump and exit
if [ "${1:-}" = "--list" ]; then
    for i in "${!AGENTS[@]}"; do
        printf "%-22s %s\n" "${AGENTS[i]}" "${DOMAINS[i]}"
    done
    exit 0
fi

# Direct launch: bin/chl <agent>
if [ -n "${1:-}" ]; then
    SELECTED=""
    for a in "${AGENTS[@]}"; do
        if [ "$a" = "$1" ]; then
            SELECTED="$1"
            break
        fi
    done
    if [ -z "$SELECTED" ]; then
        echo "Unknown agent: $1" >&2
        echo "Available agents:" >&2
        printf '  %s\n' "${AGENTS[@]}" >&2
        exit 1
    fi
else
    # Interactive picker
    printf '\n\033[1m🎯  CHL Agents\033[0m   ─ pick one to scope this session\n\n'
    for i in "${!AGENTS[@]}"; do
        # Truncate description to fit terminal nicely
        d="${DESCS[i]}"
        if [ ${#d} -gt 90 ]; then d="${d:0:90}…"; fi
        printf '  \033[1m%2d)\033[0m \033[36m%-20s\033[0m %s\n' "$((i+1))" "${AGENTS[i]}" "$d"
    done
    printf '\n  \033[2m  0) (no agent — open unscoped Claude Code)\033[0m\n\n'
    read -r -p "Pick an agent [number or name]: " choice

    SELECTED=""
    if [[ "$choice" =~ ^[0-9]+$ ]]; then
        if [ "$choice" = "0" ]; then
            SELECTED=""
        else
            idx=$((choice - 1))
            if [ "$idx" -ge 0 ] && [ "$idx" -lt "${#AGENTS[@]}" ]; then
                SELECTED="${AGENTS[idx]}"
            fi
        fi
    elif [ -n "$choice" ]; then
        for a in "${AGENTS[@]}"; do
            if [ "$a" = "$choice" ]; then
                SELECTED="$a"
                break
            fi
        done
        if [ -z "$SELECTED" ]; then
            echo "Unknown agent: $choice" >&2
            exit 1
        fi
    fi
fi

cd "$PROJECT_DIR"
if [ -n "$SELECTED" ]; then
    printf '\n\033[1m🎯  Launching with %s\033[0m\n\n' "$SELECTED"
    exec claude --agent "$SELECTED"
else
    printf '\n\033[2m⚠️  No agent selected — opening unscoped Claude Code session\033[0m\n\n'
    exec claude
fi
