#!/usr/bin/env bash
set -euo pipefail
VERSION=0.21.8
MODE=${1:---server}
BUNDLE=$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" && pwd)
case "$MODE" in --server|--desktop|--status|--uninstall) ;; *) echo 'Usage: install.sh [--server|--desktop|--status|--uninstall]' >&2; exit 2;; esac
if [[ "$MODE" == --status ]]; then systemctl status nomad-agent.service --no-pager; exit; fi
if (( EUID != 0 )); then
  command -v sudo >/dev/null || { echo 'Root or sudo is required.' >&2; exit 1; }
  tmp=$(mktemp)
  if [[ -f "${BASH_SOURCE[0]:-}" ]]; then cp "${BASH_SOURCE[0]}" "$tmp"; else curl -fsSL https://app.nomadnet.ai/releases/linux/install.sh -o "$tmp"; fi
  sudo bash "$tmp" "$MODE"; result=$?; rm -f "$tmp"; exit "$result"
fi
if [[ "$MODE" == --uninstall ]]; then
  systemctl disable --now nomad-agent.service || true
  rm -f /etc/systemd/system/nomad-agent.service /usr/local/bin/nomad /usr/share/applications/nomad.desktop
  systemctl daemon-reload
  echo 'Service and launcher removed. /opt/nomad and /var/lib/nomad-agent retained to preserve data. For a deb installation also run apt remove nomad-agent.'
  exit 0
fi
command -v systemctl >/dev/null || { echo 'A systemd Linux host is required.' >&2; exit 1; }
if command -v apt-get >/dev/null; then
  apt-get update -qq
  DEBIAN_FRONTEND=noninteractive apt-get install -y python3 python3-venv git curl ca-certificates tar
elif command -v dnf >/dev/null; then
  dnf install -y python3 python3-pip git curl ca-certificates tar
elif command -v yum >/dev/null; then
  yum install -y python3 python3-pip git curl ca-certificates tar
elif command -v pacman >/dev/null; then
  pacman -Syu --needed --noconfirm python python-pip git curl ca-certificates tar
else echo 'Supported package managers: apt-get, dnf, yum, pacman' >&2; exit 1; fi
ROOT=/opt/nomad
if [[ -f "$BUNDLE/core/pyproject.toml" && "$BUNDLE" != "$ROOT" ]]; then
  mkdir -p "$ROOT"
  cp -a "$BUNDLE/." "$ROOT/"
fi
if [[ ! -f "$ROOT/core/pyproject.toml" ]]; then
  case "$(uname -m)" in x86_64) arch=x64;; aarch64|arm64) arch=arm64;; *) echo 'Unsupported architecture' >&2; exit 1;; esac
  stage=$(mktemp -d)
  trap 'rm -rf "$stage"' EXIT
  base=https://app.nomadnet.ai/releases/linux
  curl -fSL "$base/Nomad-$VERSION-linux-$arch.tar.gz" -o "$stage/release.tar.gz"
  curl -fsSL "$base/SHA256SUMS" -o "$stage/SHA256SUMS"
  expected=$(awk -v name="Nomad-$VERSION-linux-$arch.tar.gz" '$2 == name {print $1}' "$stage/SHA256SUMS")
  [[ -n "$expected" ]] || { echo 'Missing checksum' >&2; exit 1; }
  echo "$expected  $stage/release.tar.gz" | sha256sum -c -
  mkdir -p "$ROOT"
  tar -xzf "$stage/release.tar.gz" -C "$ROOT" --strip-components=1
fi
# Install managed Python 3.14 for consistent runtime behavior on supported distributions.
if [[ ! -x "$ROOT/tools/uv" ]]; then
  uv_script=$(mktemp)
  curl -fsSL https://astral.sh/uv/install.sh -o "$uv_script"
  UV_INSTALL_DIR="$ROOT/tools" UV_NO_MODIFY_PATH=1 sh "$uv_script"
  rm -f "$uv_script"
fi
export UV_PYTHON_INSTALL_DIR="$ROOT/python"
"$ROOT/tools/uv" python install 3.14
"$ROOT/tools/uv" venv --python 3.14 --allow-existing "$ROOT/venv"
"$ROOT/tools/uv" pip install --python "$ROOT/venv/bin/python" -e "$ROOT/core"
id nomad-agent >/dev/null 2>&1 || useradd --system --home-dir /var/lib/nomad-agent --create-home --shell /usr/sbin/nologin nomad-agent
install -d -m 700 -o nomad-agent -g nomad-agent /var/lib/nomad-agent/home
if [[ ! -f /var/lib/nomad-agent/home/profiles/nomad/distribution.yaml ]]; then
  runuser -u nomad-agent -- env HOME=/var/lib/nomad-agent HERMES_HOME=/var/lib/nomad-agent/home PYTHONPATH="$ROOT/core" "$ROOT/venv/bin/python" -m hermes_cli.main profile install "$ROOT/overlay" -y
fi
install -m 755 "$ROOT/bin/nomad" /usr/local/bin/nomad
install -m 644 "$ROOT/nomad-agent.service" /etc/systemd/system/nomad-agent.service
if [[ "$MODE" == --desktop ]]; then
  if command -v apt-get >/dev/null; then apt-get install -y xdg-utils; elif command -v dnf >/dev/null; then dnf install -y xdg-utils; elif command -v yum >/dev/null; then yum install -y xdg-utils; else pacman -S --needed --noconfirm xdg-utils; fi
  install -Dm644 "$ROOT/nomad.desktop" /usr/share/applications/nomad.desktop; fi
systemctl daemon-reload
systemctl enable nomad-agent.service
systemctl restart nomad-agent.service
for attempt in {1..45}; do
  if curl -fsS http://127.0.0.1:9129/ -o /dev/null; then
    echo 'Nomad ready at http://127.0.0.1:9129. For remote access use an SSH tunnel or an authenticated TLS proxy.'
    exit 0
  fi
  sleep 2
done
journalctl -u nomad-agent.service -n 30 --no-pager
exit 1
