#!/bin/sh
# DNA CLI — Agentic DNA unified command
# Routes subcommands to appropriate handlers
# Dual-mode: dev (tsx + scripts/*.ts) vs published (node + dist/scripts/*.js)

# Resolve symlinks to find real repo location
_self="$0"
while [ -L "$_self" ]; do
  _dir="$(cd "$(dirname "$_self")" && pwd)"
  _self="$(readlink "$_self")"
  case "$_self" in /*) ;; *) _self="$_dir/$_self" ;; esac
done
DNA_CODE="$(cd "$(dirname "$_self")/.." && pwd)"

# Data directory: ~/.dna > ~/.openclaw/.dna > ~/.agentic-dna
if [ -d "$HOME/.dna" ]; then
  DNA_DATA="$HOME/.dna"
elif [ -d "$HOME/.openclaw/.dna" ]; then
  DNA_DATA="$HOME/.openclaw/.dna"
else
  DNA_DATA="$HOME/.agentic-dna"
fi
export DNA_DATA

# Runtime detection: dev mode (tsx + .ts) vs published (node + .js)
if [ -f "$DNA_CODE/scripts/spec-cli.ts" ] && [ -x "$DNA_CODE/node_modules/.bin/tsx" ]; then
  TSX="$DNA_CODE/node_modules/.bin/tsx"
  SCRIPTS="$DNA_CODE/scripts"
  EXT="ts"
else
  TSX="node"
  SCRIPTS="$DNA_CODE/dist/scripts"
  EXT="js"
fi

subcmd="${1:-help}"
shift 2>/dev/null

case "$subcmd" in
  spec)
    exec "$TSX" "$SCRIPTS/spec-cli.$EXT" "$@"
    ;;
  philosophy)
    exec "$TSX" "$SCRIPTS/philosophy-cli.$EXT" "$@"
    ;;
  convention)
    exec "$TSX" "$SCRIPTS/convention-cli.$EXT" "$@"
    ;;
  protocol)
    exec "$TSX" "$SCRIPTS/protocol-cli.$EXT" "$@"
    ;;
  architecture)
    echo "⚠️  'dna architecture' renamed to 'dna protocol'. Update your scripts." >&2
    exec "$TSX" "$SCRIPTS/protocol-cli.$EXT" "$@"
    ;;
  workflow)
    echo "⚠️  'dna workflow' renamed to 'dna protocol'. Update your scripts." >&2
    exec "$TSX" "$SCRIPTS/protocol-cli.$EXT" "$@"
    ;;
  flow)
    exec "$TSX" "$SCRIPTS/flow-cli.$EXT" "$@"
    ;;
  search)
    exec "$TSX" "$SCRIPTS/search-cli.$EXT" "$@"
    ;;
  mesh)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" "$@"
    ;;
  # ── Mesh query shortcuts (NEBULA-54) ──────────────
  tour)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" tour "$@"
    ;;
  ls)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" ls "$@"
    ;;
  find)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" find "$@"
    ;;
  show)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" show "$@"
    ;;
  whoami)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" whoami "$@"
    ;;
  links)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" links "$@"
    ;;
  refs)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" refs "$@"
    ;;
  impact)
    exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" impact "$@"
    ;;
  # ── dna node <id> (NEBULA-55) ─────────────────────
  node)
    _node_id="${1:-}"
    shift 2>/dev/null
    _node_flag="${1:-}"
    case "$_node_flag" in
      --links)  exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" links "$_node_id" "$@" ;;
      --refs)   exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" refs  "$_node_id" "$@" ;;
      --impact) exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" impact "$_node_id" "$@" ;;
      --tour)   exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" tour  "$_node_id" "$@" ;;
      *)        exec "$TSX" "$SCRIPTS/mesh-cli.$EXT" show  "$_node_id" "$_node_flag" "$@" ;;
    esac
    ;;
  tool)
    exec "$TSX" "$SCRIPTS/tool-cli.$EXT" "$@"
    ;;
  skill)
    exec "$TSX" "$SCRIPTS/skill-cli.$EXT" "$@"
    ;;
  hydrate)
    exec "$TSX" "$SCRIPTS/hydrate-cli.$EXT" "$@"
    ;;
  ui)
    exec "$TSX" "$SCRIPTS/ui-cli.$EXT" "$@"
    ;;
  injection)
    exec "$TSX" "$SCRIPTS/injection-cli.$EXT" "$@"
    ;;
  init)
    DATA_DIR="${DNA_DATA:-$HOME/.agentic-dna}"
    mkdir -p "$DATA_DIR/philosophies" "$DATA_DIR/conventions" "$DATA_DIR/protocols" "$DATA_DIR/flows" "$DATA_DIR/injections"
    echo "🧬 DNA initialized at $DATA_DIR"
    echo "Add philosophy entries to $DATA_DIR/philosophies/"
    echo "Add conventions to $DATA_DIR/conventions/"
    echo "Add protocols to $DATA_DIR/protocols/"
    ;;
  help|--help|-h)
    echo "🧬 Agentic DNA — Governing Knowledge System"
    echo ""
    echo "Usage: dna <subcommand> [args]"
    echo ""
    echo "Subcommands:"
    echo "  init          Initialize data directory"
    echo "  spec          GBTD spec operations"
    echo "  philosophy    Philosophy database"
    echo "  convention    Convention rules — global & local"
    echo "  protocol      Protocol paradigms — git/CI/deploy levels"
    echo "  flow          Flow procedures — global & local"
    echo "  search        Semantic search over the mesh (local ONNX embeddings)"
    echo "  mesh          Graph queries over distributed dna files (scan/show/links/refs/impact/lint)"
    echo "  tool          Toolbox: invoke registered CLIs"
    echo "  skill         Manual skill operations"
    echo "  hydrate       Pre-render {{dna}} directives in workspace files"
    echo "  injection     Prompt injection files"
    echo "  ui            Launch mesh visualization dashboard (http://localhost:4893)"
    echo ""
    echo "Mesh queries (shortcuts — all delegate to dna mesh):"
    echo "  node <id>     Primary node inspector (--links | --refs | --impact | --tour)"
    echo "  tour [id]     Guided walkthrough of a node (or empire overview)"
    echo "  ls [type]     List nodes, optionally filtered by type"
    echo "  find <pat>    Find nodes matching a pattern"
    echo "  show <id>     Node details + edges (short alias for node <id>)"
    echo "  whoami        Show current agent context"
    echo "  links <id>    Outbound edges"
    echo "  refs <id>     Inbound edges"
    echo "  impact <id>   Recursive inbound walk"
    echo ""
    echo "Examples:"
    echo "  dna init"
    echo "  dna tour"
    echo "  dna ls project"
    echo "  dna node dna://agent/nebula --links"
    echo "  dna find metu"
    echo "  dna search 'graph traversal'"
    echo "  dna hydrate --all"
    echo "  dna flow --list"
    ;;
  *)
    # Fallback: try tool routing (e.g. dna cron → dna tool cron)
    "$TSX" "$SCRIPTS/tool-cli.$EXT" --run "$subcmd" "$@"
    _exit=$?
    if [ $_exit -eq 127 ]; then
      echo "Unknown subcommand: $subcmd" >&2
      echo "Run 'dna help' for usage." >&2
      exit 1
    fi
    exit $_exit
    ;;
esac
