#!/usr/bin/env bash
# Provisioniert die Inferenz-Engine auf der AI Box (Strix Halo / Ryzen AI MAX+ 395, gfx1151)
# auf **Vulkan/RADV** — reproduzierbar. Braucht root (sudo).
#
#   sudo bash ~/mission-control-v2/deploy/provision-engine.sh
#
# Hintergrund: Auf gfx1151 ist Vulkan/RADV ggü. ROCm/HIP messbar schneller
# (Token-Gen +12–22 %, Prefill gleich; auf der Box per llama-bench verifiziert 2026-06-27)
# UND einfacher. Der ROCm-Build bleibt unter /opt/llamacpp als Rollback liegen.
set -euo pipefail

VULKAN_DIR=/opt/llamacpp-vulkan
WARMUP_DST=/usr/local/bin/llama-swap-warmup.sh
DROPIN_DIR=/etc/systemd/system/llama-swap.service.d
SRC_DIR="$(cd "$(dirname "$0")" && pwd)"
# Optional gepinnter Build (z.B. b9821). Leer = neuester Release.
PIN_BUILD="${MC_ENGINE_BUILD:-}"

echo "==> 1. RADV-Treiber + Vulkan-Runtime"
export DEBIAN_FRONTEND=noninteractive
apt-get update -qq
apt-get install -y mesa-vulkan-drivers libvulkan1 vulkan-tools curl jq

echo "==> 2. llama.cpp Vulkan-Build nach $VULKAN_DIR"
if [ -n "$PIN_BUILD" ]; then
  TAG="$PIN_BUILD"
else
  TAG="$(curl -s https://api.github.com/repos/ggml-org/llama.cpp/releases/latest | jq -r .tag_name)"
fi
ASSET="llama-${TAG}-bin-ubuntu-vulkan-x64.tar.gz"
URL="https://github.com/ggml-org/llama.cpp/releases/download/${TAG}/${ASSET}"
TMP="$(mktemp -d)"
echo "    Lade $URL"
curl -sL -o "$TMP/v.tgz" "$URL"
mkdir -p "$VULKAN_DIR"
tar xzf "$TMP/v.tgz" -C "$TMP"
# Tarball entpackt nach .../llama-<tag>/ — Inhalt flach nach $VULKAN_DIR
cp -rf "$TMP"/llama-*/. "$VULKAN_DIR"/
rm -rf "$TMP"
test -x "$VULKAN_DIR/llama-server"

echo "==> 3. Symlink llama-server -> Vulkan-Build"
ln -sfn "$VULKAN_DIR/llama-server" /usr/local/bin/llama-server

echo "==> 4. systemd Drop-ins für llama-swap (LD_LIBRARY_PATH + Brain-Warmup)"
mkdir -p "$DROPIN_DIR"
cat > "$DROPIN_DIR/vulkan.conf" <<EOF
[Service]
Environment=LD_LIBRARY_PATH=$VULKAN_DIR
EOF
install -m 0755 "$SRC_DIR/warmup.sh" "$WARMUP_DST"
cat > "$DROPIN_DIR/warmup.conf" <<EOF
[Service]
# Nach jedem (Re)Start die brains vorladen. Das Skript detacht sich selbst (blockiert
# den Start nicht); '-' macht den Aufruf fehlertolerant (kann llama-swap nie failen lassen).
ExecStartPost=-$WARMUP_DST
EOF

echo "==> 5. Reload + Restart"
systemctl daemon-reload
systemctl restart llama-swap
sleep 3
systemctl is-active llama-swap

echo "==> Fertig. Aktive Engine:"
readlink -f /usr/local/bin/llama-server
vulkaninfo --summary 2>/dev/null | grep -m1 deviceName || true
echo "Rollback auf ROCm: ln -sfn /opt/llamacpp/llama-server /usr/local/bin/llama-server && rm $DROPIN_DIR/vulkan.conf && systemctl daemon-reload && systemctl restart llama-swap"
