#!/usr/bin/env bash
# dshboxup payload — RUNS ON dshbox (instabox fleet box, Debian 13).
# Not for zocomp: dshbox layout differs (dsh home /data/home/.dsh, systemd unit dsh-web).
# Update dsh core, restart dsh-web, health-check, report boot failures + fresh token.
set -u
HOSTN="$(hostname)"
echo "══ dshboxup on $HOSTN $(date -u '+%Y-%m-%d %H:%M UTC') ══"

if [ "$(id -u)" = "0" ]; then SUDO=""; else SUDO="sudo"; fi

OLD="$(dsh --version 2>/dev/null || echo unknown)"
$SUDO npm install -g @deepseek-ai/dsh@latest >/tmp/dshboxup-npm.log 2>&1
NEW="$(dsh --version 2>/dev/null || echo unknown)"
echo "core: $OLD -> $NEW"
grep -q EBADENGINE /tmp/dshboxup-npm.log && echo "note: EBADENGINE advisory (dsh wants node >=24.9, box has v22) — advisory only, runs"

$SUDO systemctl restart dsh-web
sleep 4
STATE="$(systemctl is-active dsh-web)"
NRESTARTS="$($SUDO systemctl show dsh-web -p NRestarts --value)"
echo "service: $STATE (NRestarts=$NRESTARTS)"

TOKEN="$($SUDO journalctl -u dsh-web --since '-2 min' 2>/dev/null | grep -oE 'token=[A-Za-z0-9_-]+' | cut -d= -f2 | tail -1)"
HEALTH="fail"
if [ -n "$TOKEN" ]; then
  CODE_TOKEN=$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:3080/?token=$TOKEN")
  CODE_ROOT=$(curl -s -o /dev/null -w '%{http_code}' "http://127.0.0.1:3080/")
  [ "$CODE_TOKEN" = "200" ] || [ "$CODE_TOKEN" = "303" ] && HEALTH="ok"
  echo "health: $HEALTH (token=$CODE_TOKEN root=$CODE_ROOT)"
else
  echo "health: fail (no token in journal yet)"
fi

echo "--- boot failures (last restart) ---"
$SUDO journalctl -u dsh-web --since '-2 min' 2>/dev/null | grep -E "did not activate|Failed to load plugins|: failed|: pending" | tail -5 || true
echo "(empty = clean boot)"

echo "--- local plugins ---"
for p in /data/home/.dsh/plugins-local/*/; do
  [ -d "$p" ] || continue
  name=$(basename "$p")
  ver=$(grep -o '"version": *"[^"]*"' "$p/package.json" 2>/dev/null | cut -d'"' -f4 | head -1)
  echo "  $name ${ver:-?}"
done

echo "--- tailscale/dns ---"
systemctl is-active dns-watchdog.timer 2>/dev/null | xargs echo "dns-watchdog.timer:"
tailscale status --peers=false 2>/dev/null || echo "tailscale: not ready"

echo "══ token (rotates per restart) ══"
echo "http://127.0.0.1:3080/?token=$TOKEN  →  https://dshbox-1.hen-economy.ts.net/"
[ "$HEALTH" = "ok" ] && [ "$STATE" = "active" ] && exit 0 || exit 1
