#!/usr/bin/env bash

set -euo pipefail

NODE_PATH_FILE=/var/lib/agent-insight/runtime/node-path
MIN_NODE_MAJOR=20

node_is_compatible() {
  local candidate="$1"
  local version
  local major

  [ -x "$candidate" ] || return 1
  version="$("$candidate" -p 'process.versions.node' 2>/dev/null)" || return 1
  major="${version%%.*}"
  [[ "$major" =~ ^[0-9]+$ ]] || return 1
  [ "$major" -ge "$MIN_NODE_MAJOR" ]
}

resolve_node() {
  local configured_node=""
  local candidate

  if [ -r "$NODE_PATH_FILE" ]; then
    configured_node="$(head -n 1 "$NODE_PATH_FILE")"
  fi
  for candidate in \
    "$configured_node" \
    /var/lib/agent-insight/runtime/node \
    /usr/local/bin/node \
    /usr/bin/node \
    /bin/node \
    /opt/node/bin/node; do
    [ -n "$candidate" ] || continue
    if node_is_compatible "$candidate"; then
      printf '%s\n' "$candidate"
      return 0
    fi
  done
  return 1
}

NODE_BIN="$(resolve_node)" || {
  printf '%s\n' 'agent-insight: Node.js 20 or newer is unavailable to the service user.' >&2
  printf '%s\n' 'Install Node.js, then run: sudo /usr/libexec/agent-insight-node-setup' >&2
  exit 127
}

export PRISMA_SCHEMA_ENGINE_BINARY="${PRISMA_SCHEMA_ENGINE_BINARY:-/usr/lib/agent-insight/node_modules/@prisma/engines/schema-engine-debian-openssl-3.0.x}"
export PRISMA_QUERY_ENGINE_LIBRARY="${PRISMA_QUERY_ENGINE_LIBRARY:-/usr/lib/agent-insight/node_modules/@prisma/engines/libquery_engine-debian-openssl-3.0.x.so.node}"

case "${1:-}" in
  check)
    exec "$NODE_BIN" --version
    ;;
  migrate)
    exec "$NODE_BIN" \
      /usr/lib/agent-insight/node_modules/prisma/build/index.js \
      db push --skip-generate \
      --schema /usr/lib/agent-insight/prisma/schema.prisma
    ;;
  start)
    exec "$NODE_BIN" /usr/lib/agent-insight/server.js
    ;;
  *)
    printf 'Usage: %s {check|migrate|start}\n' "$0" >&2
    exit 2
    ;;
esac
