#!/bin/sh
# Offline-Testlauf für den Telegram-Plugin-Patch (Aria V3, Phase E).
#
# - Kopiert server.ts, server.prod-0.0.6.ts, aria-gateway.ts, die Tests und das
#   Python-Paket in ein frisches Arbeitsverzeichnis (der Worktree bleibt unberührt).
# - Verlinkt die node_modules des installierten Plugins NUR LESEND (Symlink).
#   Nach dem Lauf wird geprüft, dass darin nichts neuer ist als der Start-Stempel.
# - Startet jede Testdatei in einem eigenen bun-Prozess mit leerer Umgebung
#   (env -i, HOME im Arbeitsverzeichnis, kein Token, kein Netzwerkziel).
#
# Aufruf: telegram/plugin/test/run-tests.sh [testdatei ...]
# Umgebung (optional): ARIA_TEST_TMPDIR (Basis für das Arbeitsverzeichnis),
#   ARIA_PLUGIN_NODE_MODULES, BUN, ARIA_TEST_KEEP=1 (Arbeitsverzeichnis behalten).
set -eu

HERE=$(cd "$(dirname "$0")" && pwd)
PLUGIN=$(dirname "$HERE")
REPO=$(cd "$PLUGIN/../.." && pwd)
NM=${ARIA_PLUGIN_NODE_MODULES:-/home/aria/.claude/plugins/cache/claude-plugins-official/telegram/0.0.6/node_modules}
BUN=${BUN:-/usr/local/bin/bun}
PY=/usr/bin/python3
BASE=${ARIA_TEST_TMPDIR:-${TMPDIR:-/tmp}}

[ -d "$NM/grammy" ] || { echo "node_modules des Plugins fehlen: $NM" >&2; exit 2; }
[ -x "$BUN" ] || { echo "bun fehlt: $BUN" >&2; exit 2; }

WORK=$(/usr/bin/mktemp -d "$BASE/aria-plugin-test.XXXXXX")
H="$WORK/harness"
/usr/bin/mkdir -p "$H/plugin" "$H/test" "$H/python" "$WORK/home" "$WORK/tmp" "$WORK/out"
/usr/bin/ln -s "$NM" "$H/node_modules"
/usr/bin/cp "$PLUGIN/server.ts" "$PLUGIN/server.prod-0.0.6.ts" "$H/plugin/"
[ -f "$PLUGIN/aria-gateway.ts" ] && /usr/bin/cp "$PLUGIN/aria-gateway.ts" "$H/plugin/"
[ -f "$PLUGIN/server.ts.patch" ] && /usr/bin/cp "$PLUGIN/server.ts.patch" "$H/plugin/"
/usr/bin/cp -R "$HERE/." "$H/test/"
/usr/bin/cp -R "$REPO/python/aria_router" "$REPO/python/bin" "$H/python/"
/usr/bin/mkdir -p "$H/docs" && /usr/bin/cp "$REPO/docs/bridge-protokoll.schema.json" "$H/docs/"
[ -d "$REPO/python/tests/fixtures" ] && /usr/bin/mkdir -p "$H/python/tests" && /usr/bin/cp -R "$REPO/python/tests/fixtures" "$H/python/tests/"
/usr/bin/printf '[install]\nauto = "disable"\n' > "$H/bunfig.toml"
/usr/bin/touch "$WORK/stamp"
/usr/bin/sleep 1

if [ "$#" -gt 0 ]; then
  FILES="$*"
else
  FILES="static.test.ts gateway-unit.test.ts trace-prod trace-off trace-shadow compare-traces.test.ts modes.test.ts e2e-python.test.ts"
fi

TOTAL_PASS=0
TOTAL_FAIL=0
TOTAL_FILES=0
STATUS=0
for entry in $FILES; do
  case "$entry" in
    trace-prod)   file=trace.test.ts; extra="ARIA_TRACE_TARGET=prod" ;;
    trace-off)    file=trace.test.ts; extra="ARIA_TRACE_TARGET=off" ;;
    trace-shadow) file=trace.test.ts; extra="ARIA_TRACE_TARGET=shadow" ;;
    *)            file=$entry; extra="ARIA_TRACE_TARGET=none" ;;
  esac
  log="$WORK/out/$entry.log"
  set +e
  ( cd "$H" && /usr/bin/env -i HOME="$WORK/home" PATH=/usr/bin:/bin TMPDIR="$WORK/tmp" LANG=C.UTF-8 \
      ARIA_TEST_WORK="$WORK" ARIA_TEST_HARNESS="$H" ARIA_TEST_PYTHON="$PY" $extra \
      /usr/bin/timeout -k 5 600 "$BUN" --no-install --no-env-file test --timeout=60000 "$H/test/$file" ) >"$log" 2>&1
  rc=$?
  set -e
  pass=$(/usr/bin/sed -n 's/^ *\([0-9][0-9]*\) pass$/\1/p' "$log" | /usr/bin/tail -1)
  fail=$(/usr/bin/sed -n 's/^ *\([0-9][0-9]*\) fail$/\1/p' "$log" | /usr/bin/tail -1)
  pass=${pass:-0}; fail=${fail:-0}
  TOTAL_PASS=$((TOTAL_PASS + pass)); TOTAL_FAIL=$((TOTAL_FAIL + fail)); TOTAL_FILES=$((TOTAL_FILES + 1))
  echo "$entry: rc=$rc pass=$pass fail=$fail"
  if [ "$rc" -ne 0 ] || [ "$fail" -ne 0 ] || [ "$pass" -eq 0 ]; then
    STATUS=1
    /usr/bin/grep -E '\(fail\)|error:|Error|expect\(' "$log" | /usr/bin/head -40 || true
  fi
done

# node_modules des Plugins dürfen nicht verändert worden sein.
CHANGED=$(/usr/bin/find "$NM/" -newer "$WORK/stamp" -print 2>/dev/null | /usr/bin/head -5)
if [ -n "$CHANGED" ]; then
  echo "FEHLER: node_modules des Plugins verändert:" >&2
  echo "$CHANGED" >&2
  STATUS=1
else
  echo "node_modules unverändert (find -newer stamp: 0 Treffer)"
fi

echo "SUMME: Dateien=$TOTAL_FILES pass=$TOTAL_PASS fail=$TOTAL_FAIL status=$STATUS"
echo "Logs: $WORK/out"
if [ "${ARIA_TEST_KEEP:-0}" != "1" ] && [ "$STATUS" -eq 0 ]; then
  /usr/bin/rm -rf "$WORK"
  echo "Arbeitsverzeichnis entfernt (ARIA_TEST_KEEP=1 behält es)"
fi
exit "$STATUS"
