#!/usr/bin/env bash
# claude-repl worker-bee installer — same shape as claude-cli's. Builds
# the standalone binary, registers a user systemd / launchd unit,
# starts. humd never learns about claude-repl at compile time; the
# worker registers at runtime via thrum bee:["worker"].
set -euo pipefail

HIVE_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$HIVE_DIR/../.." && pwd)"
KIND="claude-repl"
UNIT_NAME="hum-$KIND-worker"
WORKER_BIN="$HOME/.local/bin/${KIND}-worker"

if [ -n "${XDG_RUNTIME_DIR:-}" ]; then
  DEFAULT_SOCK="$XDG_RUNTIME_DIR/hum/thrum.sock"
else
  DEFAULT_SOCK="/tmp/hum-$(id -u)/thrum.sock"
fi
THRUM_SOCK="${HUM_THRUM_SOCK:-$DEFAULT_SOCK}"
CLAUDE_BIN="${CLAUDE_CLI_PATH:-$(command -v claude || echo claude)}"
XDG_CONFIG_HOME="${XDG_CONFIG_HOME:-$HOME/.config}"

log()  { printf '\033[1m[%s-worker]\033[0m %s\n' "$KIND" "$*"; }
warn() { printf '\033[1;33m[%s-worker]\033[0m %s\n' "$KIND" "$*" >&2; }
fail() { printf '\033[1;31m[%s-worker]\033[0m %s\n' "$KIND" "$*" >&2; exit 1; }

SVC="$REPO_ROOT/scripts/svc.sh"
[ -f "$SVC" ] || fail "scripts/svc.sh missing"
# shellcheck source=/dev/null
. "$SVC"

build() {
  if [ -x "$WORKER_BIN" ]; then
    log "binary already present: $WORKER_BIN — skipping cargo"
    return 0
  fi
  if ! command -v cargo >/dev/null 2>&1; then
    fail "no $WORKER_BIN and cargo unavailable — install rustup or have an upstream deploy supply the binary"
  fi
  log "building $KIND-worker (cargo install --path $HIVE_DIR)"
  cargo install --quiet --locked --path "$HIVE_DIR" --root "$HOME/.local" --force --bin "${KIND}-worker"
  [ -x "$WORKER_BIN" ] || fail "binary not at $WORKER_BIN after build"
  log "built: $WORKER_BIN"
}

install_unit() {
  case "$SVC_OS" in
    Linux|Darwin) ;;
    *) warn "service install unsupported on $SVC_OS — run '$WORKER_BIN' manually"; return 0 ;;
  esac
  svc_install "$UNIT_NAME" "$WORKER_BIN" \
    --env "HUM_LOG_LEVEL=info" \
    --env "XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/run/user/$(id -u)}" \
    --env "HUM_THRUM_SOCK=$THRUM_SOCK" \
    --env "CLAUDE_CLI_PATH=$CLAUDE_BIN" \
    --env "CLAUDE_MODELS=${CLAUDE_MODELS:-claude-opus-4-7,claude-sonnet-4-6,claude-haiku-4-5}" \
    --env "PATH=$HOME/.local/bin:/usr/local/bin:/usr/bin:/bin"
  svc_restart "$UNIT_NAME" 2>/dev/null || svc_start "$UNIT_NAME" 2>/dev/null || true
  sleep 1
  if svc_is_active "$UNIT_NAME"; then
    log "$UNIT_NAME running ✓"
  else
    warn "$UNIT_NAME did not start cleanly"
  fi
}

uninstall() {
  svc_uninstall "$UNIT_NAME" 2>/dev/null || true
  log "uninstalled."
}

case "${1:-install}" in
  install|"") build && install_unit ;;
  uninstall) uninstall ;;
  *) fail "unknown command: $1 (try: install, uninstall)" ;;
esac
