#!/bin/sh
# canvasok-mcp: starts `canvasok mcp` (the stdio MCP server) for agent clients.
# Shipped in the client plugin as bin/canvasok-mcp; also works from the source tree.
#
# Resolution (first usable value wins):
#   node     $CANVASOK_NODE, config "node", node on PATH, /opt/homebrew/bin/node,
#            /usr/local/bin/node, ~/.volta/bin/node  (must be >= 22.18: Node runs the
#            TypeScript sources directly by type stripping)
#   server   $CANVASOK_HOME, config "canvasok_home", <plugin>/server/canvasok, <this dir>/..
#   engine   $CANVASOK_ENGINE, config "engine", else CanvasOK's default install path
#   photo    $CANVASOK_PHOTOCRAFT, config "photocraft" (the optional PhotoCraft engine for brushes,
#            layers and the eraser; opted into at install: canvasok install apply --with-engine
#            photocraft), else CanvasOK's default install path when it was fetched
#   profile  config "profile" (full|vector; read by the server itself, $CANVASOK_PROFILE wins)
#   data dir $CANVASOK_DATA_DIR, config "data_dir", else CanvasOK's default
# config = ${CANVASOK_CONFIG:-${XDG_CONFIG_HOME:-$HOME/.config}/canvasok/config.json}, written by
# `canvasok install apply` as flat JSON with one "key": "value" pair per line.
#
# Arguments are passed to `canvasok mcp` (e.g. --root DIR, --no-viewer).
# `canvasok-mcp --launcher-info` prints what would run and exits.
HERE=$(cd "$(dirname "$0")" && pwd -P)
CONFIG=${CANVASOK_CONFIG:-${XDG_CONFIG_HOME:-$HOME/.config}/canvasok/config.json}

cfg() {
  [ -f "$CONFIG" ] || return 0
  sed -n 's/^[[:space:]]*"'"$1"'"[[:space:]]*:[[:space:]]*"\([^"]*\)".*$/\1/p' "$CONFIG" | head -n 1
}

node_ok() {
  [ -n "$1" ] && [ -x "$1" ] || return 1
  v=$("$1" --version 2>/dev/null) || return 1
  v=${v#v}
  maj=${v%%.*}
  rest=${v#*.}
  min=${rest%%.*}
  case "$maj" in '' | *[!0-9]*) return 1 ;; esac
  case "$min" in '' | *[!0-9]*) return 1 ;; esac
  [ "$maj" -gt 22 ] || { [ "$maj" -eq 22 ] && [ "$min" -ge 18 ]; }
}

if [ -n "${CANVASOK_NODE:-}" ] && ! node_ok "$CANVASOK_NODE"; then
  echo "canvasok-mcp: CANVASOK_NODE=$CANVASOK_NODE is not node >= 22.18; trying others" >&2
fi
NODE=
for c in "${CANVASOK_NODE:-}" "$(cfg node)" "$(command -v node 2>/dev/null)" /opt/homebrew/bin/node /usr/local/bin/node "${HOME:-/nonexistent}/.volta/bin/node"; do
  if node_ok "$c"; then
    NODE=$c
    break
  fi
done
if [ -z "$NODE" ]; then
  echo "canvasok-mcp: node >= 22.18 not found. Install Node 22.18+ and run 'canvasok install apply', or set \"node\" in $CONFIG." >&2
  exit 127
fi

SERVER=
for c in "${CANVASOK_HOME:-}" "$(cfg canvasok_home)" "$HERE/../server/canvasok" "$HERE/.."; do
  if [ -n "$c" ] && [ -f "$c/src/cli.ts" ]; then
    SERVER=$(cd "$c" && pwd -P)
    break
  fi
done
if [ -z "$SERVER" ]; then
  echo "canvasok-mcp: CanvasOK server not found (looked at \$CANVASOK_HOME, config canvasok_home, $HERE/../server/canvasok)." >&2
  exit 1
fi

if [ -z "${CANVASOK_ENGINE:-}" ]; then
  e=$(cfg engine)
  if [ -n "$e" ]; then
    CANVASOK_ENGINE=$e
    export CANVASOK_ENGINE
  fi
fi
if [ -z "${CANVASOK_PHOTOCRAFT:-}" ]; then
  p=$(cfg photocraft)
  if [ -n "$p" ]; then
    CANVASOK_PHOTOCRAFT=$p
    export CANVASOK_PHOTOCRAFT
  fi
fi
if [ -z "${CANVASOK_DATA_DIR:-}" ]; then
  d=$(cfg data_dir)
  if [ -n "$d" ]; then
    CANVASOK_DATA_DIR=$d
    export CANVASOK_DATA_DIR
  fi
fi

if [ "${1:-}" = "--launcher-info" ]; then
  echo "config=$CONFIG"
  echo "node=$NODE"
  echo "node_version=$("$NODE" --version)"
  echo "server=$SERVER"
  echo "engine=${CANVASOK_ENGINE:-}"
  echo "photocraft=${CANVASOK_PHOTOCRAFT:-}"
  echo "profile=${CANVASOK_PROFILE:-$(cfg profile)}"
  echo "data_dir=${CANVASOK_DATA_DIR:-}"
  echo "client=${CANVASOK_CLIENT:-}"
  exit 0
fi

exec "$NODE" --disable-warning=ExperimentalWarning "$SERVER/src/cli.ts" mcp "$@"
