#!/bin/sh
# Simple Docker Ops agent installer.
#   curl -fsSL https://simpledockerops.com/install | sudo sh
# Environment overrides: SDKO_WORKER_URL, SDKO_PORTAL_URL, SDKO_RELEASES (base URL of binaries), SDKO_VERSION
set -eu
RELEASES="${SDKO_RELEASES:-https://releases.simpledockerops.com/agent}"
VERSION="${SDKO_VERSION:-latest}"
WORKER_URL="${SDKO_WORKER_URL:-https://worker.simpledockerops.com}"
PORTAL_URL="${SDKO_PORTAL_URL:-https://app.simpledockerops.com}"

if [ "$(id -u)" != "0" ]; then echo "run as root: curl -fsSL https://simpledockerops.com/install | sudo sh" >&2; exit 1; fi
case "$(uname -m)" in
  aarch64|arm64) ARCH=arm64 ;;
  x86_64|amd64) ARCH=amd64 ;;
  *) echo "unsupported architecture $(uname -m); Simple Docker Ops supports arm64 and amd64" >&2; exit 1 ;;
esac
command -v docker >/dev/null 2>&1 || { echo "Docker Engine is required. Install it first: https://docs.docker.com/engine/install/" >&2; exit 1; }
docker compose version >/dev/null 2>&1 || { echo "Docker Compose v2 plugin is required (docker-compose-plugin)." >&2; exit 1; }
command -v systemctl >/dev/null 2>&1 || { echo "systemd is required." >&2; exit 1; }

echo "==> downloading sdko-agent ($VERSION, linux/$ARCH)"
TMP=$(mktemp)
curl -fsSL "$RELEASES/$VERSION/sdko-agent-linux-$ARCH" -o "$TMP"
if curl -fsSL "$RELEASES/$VERSION/sdko-agent-linux-$ARCH.sha256" -o "$TMP.sha256" 2>/dev/null; then
  (cd "$(dirname "$TMP")" && echo "$(cut -d' ' -f1 "$TMP.sha256")  $(basename "$TMP")" | sha256sum -c - >/dev/null) || { echo "checksum mismatch" >&2; exit 1; }
fi
install -m 0755 "$TMP" /usr/local/bin/sdko-agent
rm -f "$TMP" "$TMP.sha256"

mkdir -p /etc/sdko /var/lib/sdko/apps
chmod 0750 /var/lib/sdko
if [ ! -f /etc/sdko/agent.conf ]; then
  cat > /etc/sdko/agent.conf <<CONF
WORKER_URL=$WORKER_URL
PORTAL_URL=$PORTAL_URL
UPDATE_URL=$RELEASES/manifest.json
UPDATE_PUBKEY=${SDKO_UPDATE_PUBKEY:-}
CONF
fi
curl -fsSL "$RELEASES/sdko-agent.service" -o /etc/systemd/system/sdko-agent.service 2>/dev/null || cat > /etc/systemd/system/sdko-agent.service <<'UNIT'
[Unit]
Description=Simple Docker Ops agent
After=network-online.target docker.service
Wants=network-online.target
Requires=docker.service
StartLimitIntervalSec=0
[Service]
EnvironmentFile=-/etc/sdko/agent.env
ExecStart=/usr/local/bin/sdko-agent
Restart=always
RestartSec=3
ProtectHome=yes
PrivateTmp=yes
NoNewPrivileges=yes
[Install]
WantedBy=multi-user.target
UNIT
systemctl daemon-reload
systemctl enable --now sdko-agent >/dev/null
echo "==> waiting for the enrollment code"
for _ in $(seq 1 30); do
  CODE=$(journalctl -u sdko-agent -o cat --since "-2 minutes" 2>/dev/null | grep -o '"msg":"enrollment code issued","code":"[a-z0-9-]*"' | tail -1 | sed 's/.*"code":"//; s/"//' || true)
  [ -n "$CODE" ] && break
  sleep 1
done
if [ -n "${CODE:-}" ]; then
  echo
  echo "Simple Docker Ops agent installed."
  echo "Pair this device:"
  echo "  Code: $(echo "$CODE" | tr a-z A-Z)"
  echo "  $PORTAL_URL/devices/enroll"
  echo
  echo "Or run: journalctl -u sdko-agent -f   (the QR code is printed there)"
else
  echo "Agent installed. Find the enrollment code with: journalctl -u sdko-agent -f"
fi
