#!/usr/bin/env bash
# humfs forager-bee installer — builds the standalone humfs-forager
# binary, installs a user systemd / launchd unit, and starts it. The
# forager registers with humd via thrum bee:["forager"] and advertises
# the humfs_* tool set humd routes other foragers' tool-calls through.
#
# Usage:
#   hives/humfs/install            # build + install unit + start
#   hives/humfs/install uninstall  # stop + remove unit
#
# Env:
#   HUM_THRUM_SOCK     default $XDG_RUNTIME_DIR/hum/thrum.sock
set -euo pipefail

HIVE_DIR="$(cd "$(dirname "$0")" && pwd)"
REPO_ROOT="$(cd "$HIVE_DIR/../.." && pwd)"
KIND="humfs"
UNIT_NAME="hum-$KIND-forager"
FORAGER_BIN="$HOME/.local/bin/${KIND}-forager"

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}"

log()  { printf '\033[1m[%s-forager]\033[0m %s\n' "$KIND" "$*"; }
warn() { printf '\033[1;33m[%s-forager]\033[0m %s\n' "$KIND" "$*" >&2; }
fail() { printf '\033[1;31m[%s-forager]\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 "$FORAGER_BIN" ]; then
    log "binary already present: $FORAGER_BIN — skipping cargo"
    return 0
  fi
  if ! command -v cargo >/dev/null 2>&1; then
    fail "no $FORAGER_BIN and cargo unavailable — install rustup or have an upstream deploy supply the binary"
  fi
  log "building $KIND-forager (cargo install --path $HIVE_DIR)"
  cargo install --quiet --locked --path "$HIVE_DIR" --root "$HOME/.local" --force --bin "${KIND}-forager"
  [ -x "$FORAGER_BIN" ] || fail "binary not at $FORAGER_BIN after build"
  log "built: $FORAGER_BIN"
}

install_unit() {
  case "$SVC_OS" in
    Linux|Darwin) ;;
    *) warn "service install unsupported on $SVC_OS — run '$FORAGER_BIN' manually"; return 0 ;;
  esac
  svc_install "$UNIT_NAME" "$FORAGER_BIN" \
    --env "HUM_LOG_LEVEL=info" \
    --env "XDG_RUNTIME_DIR=${XDG_RUNTIME_DIR:-/run/user/$(id -u)}" \
    --env "HUM_THRUM_SOCK=$THRUM_SOCK" \
    --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
