#!/usr/bin/env bash
# ClavueTrack worker bootstrap — curl -fsSL https://track.clavue.com/install.sh | bash
# Options:
#   --systemd        install a systemd unit template (user unit unless root)
#   --help           show this help
# Env:
#   TRACK_URL        control plane base (default https://track.clavue.com)
#   DEST             install dir (default $HOME/clavuetrack-worker)
#   PYTHON           python binary (default python3)
#   INSTALL_SYSTEMD=1 same as --systemd
set -euo pipefail

TRACK_URL=${TRACK_URL:-https://track.clavue.com}
DEST=${DEST:-$HOME/clavuetrack-worker}
PYTHON=${PYTHON:-python3}
INSTALL_SYSTEMD=${INSTALL_SYSTEMD:-0}

usage() {
  sed -n '2,12p' "$0" | sed 's/^# \{0,1\}//'
}

for arg in "$@"; do
  case "$arg" in
    --systemd) INSTALL_SYSTEMD=1 ;;
    -h|--help) usage; exit 0 ;;
    *) echo "unknown option: $arg" >&2; usage; exit 1 ;;
  esac
done

# When run from a local checkout (bash apps/api/public/install.sh) with the repo
# root as cwd, install from the repo's apps/worker tree instead of the network.
SCRIPT_DIR=""
if [[ -n "${BASH_SOURCE[0]:-}" ]] && [[ -f "${BASH_SOURCE[0]}" ]]; then
  SCRIPT_DIR=$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)
fi
LOCAL_WORKER=""
if [[ -n "$SCRIPT_DIR" ]] && [[ -d "$SCRIPT_DIR/../../worker" ]]; then
  LOCAL_WORKER=$(cd "$SCRIPT_DIR/../../worker" && pwd)
fi

echo "==> ClavueTrack worker installer"
echo "    control plane: $TRACK_URL"
echo "    install dir:   $DEST"

# Version hint vs control-plane /healthz (auto-update nudge)
HEALTH_JSON=""
if command -v curl >/dev/null 2>&1; then
  HEALTH_JSON=$(curl -fsSL --max-time 5 "$TRACK_URL/healthz" 2>/dev/null || true)
elif command -v wget >/dev/null 2>&1; then
  HEALTH_JSON=$(wget -q -O - --timeout=5 "$TRACK_URL/healthz" 2>/dev/null || true)
fi
if [[ -n "$HEALTH_JSON" ]]; then
  CP_VER=$(printf '%s' "$HEALTH_JSON" | sed -n 's/.*"version"[[:space:]]*:[[:space:]]*"\([^"]*\)".*/\1/p' | head -1)
  echo "    control-plane version: ${CP_VER:-unknown}"
  LOCAL_HINT="1.0.0"
  if [[ -n "$CP_VER" && "$CP_VER" != "$LOCAL_HINT" ]]; then
    echo "    hint: installer ships worker matching API $LOCAL_HINT; control plane reports $CP_VER"
    echo "          re-run this install.sh after upgrading the control plane if worker protocol drifts"
  fi
else
  echo "    (could not reach $TRACK_URL/healthz for version check)"
fi

if ! command -v "$PYTHON" >/dev/null 2>&1; then
  echo "ERROR: python3 not found. Install Python >= 3.11 first." >&2
  exit 1
fi
if ! command -v tar >/dev/null 2>&1; then
  echo "ERROR: tar not found." >&2
  exit 1
fi

mkdir -p "$DEST"
if [[ -n "$LOCAL_WORKER" ]]; then
  echo "==> Copying worker from local checkout $LOCAL_WORKER"
  cp -a "$LOCAL_WORKER/." "$DEST/"
else
  TMP=$(mktemp -d)
  trap 'rm -rf "$TMP"' EXIT
  echo "==> Downloading $TRACK_URL/worker.tgz"
  if command -v curl >/dev/null 2>&1; then
    curl -fsSL -o "$TMP/worker.tgz" "$TRACK_URL/worker.tgz"
  elif command -v wget >/dev/null 2>&1; then
    wget -q -O "$TMP/worker.tgz" "$TRACK_URL/worker.tgz"
  else
    echo "ERROR: need curl or wget to download worker.tgz" >&2
    exit 1
  fi
  echo "==> Extracting into $DEST"
  tar -xzf "$TMP/worker.tgz" -C "$DEST"
fi

echo "==> Creating venv at $DEST/.venv"
"$PYTHON" -m venv "$DEST/.venv"
"$DEST/.venv/bin/python" -m pip install -q --upgrade pip
if [[ -f "$DEST/requirements.txt" ]]; then
  "$DEST/.venv/bin/pip" install -q -r "$DEST/requirements.txt"
else
  "$DEST/.venv/bin/pip" install -q "httpx>=0.27" "typer>=0.15"
fi

PY="$DEST/.venv/bin/python"

if [[ "$INSTALL_SYSTEMD" == "1" ]]; then
  if [[ "$(id -u)" == "0" ]]; then
    UNIT=/etc/systemd/system/clavuetrack-worker.service
    WANTED=multi-user.target
  else
    UNIT=$HOME/.config/systemd/user/clavuetrack-worker.service
    WANTED=default.target
  fi
  mkdir -p "$(dirname "$UNIT")"
  cat > "$UNIT" << UNITEOF
[Unit]
Description=ClavueTrack GPU worker
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
WorkingDirectory=$DEST
Environment=TRACK_URL=$TRACK_URL
Environment=WORKER_ID=REPLACE_ME
Environment=WORKER_SECRET=REPLACE_ME
Environment=INFERENCE_URL=http://127.0.0.1:8000/v1
Environment=WORKER_MODELS=REPLACE_ME
Environment=WORKER_CAPACITY=4
Environment=PYTHONPATH=$DEST
ExecStart=$PY -m clavue_worker.cli run
Restart=always
RestartSec=5

[Install]
WantedBy=$WANTED
UNITEOF
  echo "==> systemd unit written: $UNIT"
  if [[ "$(id -u)" == "0" ]]; then
    echo "    systemctl daemon-reload && systemctl enable --now clavuetrack-worker"
  else
    echo "    systemctl --user daemon-reload && systemctl --user enable --now clavuetrack-worker"
    echo "    (keep user session alive: loginctl enable-linger \$USER)"
  fi
fi

cat << MSG

==> Deps installed in venv: $DEST/.venv

Register a worker (reports nvidia-smi GPUs; optional fleet JSON via CLAVUETRACK_FLEET_JSON):

  export TRACK_URL=$TRACK_URL
  export PYTHONPATH=$DEST
  # Optional aggregated cluster GPUs (gateway):
  # export CLAVUETRACK_FLEET_JSON=/etc/clavuetrack/fleet.json
  $PY -m clavue_worker.cli register --name "\$(hostname)" --models YOUR_MODEL_ID --capacity 4

Save WORKER_ID / WORKER_SECRET from the output, then run (real inference, not --mock):

  export INFERENCE_URL=http://127.0.0.1:8000/v1   # or your OpenAI-compatible base
  export WORKER_MODELS=YOUR_MODEL_ID
  export WORKER_CAPACITY=4
  $PY -m clavue_worker.cli run

Seller panel (earnings + payouts): $TRACK_URL/seller/

Buyer smoke test:

  curl -s $TRACK_URL/v1/models -H "Authorization: Bearer sk-ct-..."
  curl -s $TRACK_URL/v1/usage  -H "Authorization: Bearer sk-ct-..."

Docs: $TRACK_URL/console/  ·  PoC: see docs/POC-vLLM.md in the repo
MSG
