#!/usr/bin/env bash
# Build dist/avtoambor-patch.zip — a small build/-only update for an
# already-installed Windows deployment.
#
# Use this when only application code has changed since the last full bundle.
# The patch is just the SvelteKit build output; node_modules, .bat launchers,
# and the native better-sqlite3 binary on the target stay untouched.
#
# The script compares package-lock.json and src/lib/server/*.sql against the
# staging snapshot left by scripts/make-bundle.sh (dist/avtoambor/). If those
# changed, a full re-bundle is required instead — the patch alone won't work.

set -euo pipefail

cd "$(dirname "$0")/.."
ROOT="$(pwd)"
DIST="$ROOT/dist"
BASELINE="$DIST/avtoambor"
PATCH_DIR="$DIST/patch"
ZIP="$DIST/avtoambor-patch.zip"

for cmd in npm zip rsync diff; do
  command -v "$cmd" >/dev/null || { echo "make-patch.sh: missing required tool: $cmd"; exit 1; }
done

if [ ! -d "$BASELINE" ]; then
  echo "make-patch.sh: no baseline at $BASELINE."
  echo "  Run scripts/make-bundle.sh first to establish a baseline."
  exit 1
fi

# --- safety checks: things a build/-only patch cannot deliver ---
WARN=0
warn() { echo "  ! $*"; WARN=1; }

echo "==> Checking patch safety against baseline ($BASELINE)"
if ! diff -q "$ROOT/package-lock.json" "$BASELINE/package-lock.json" >/dev/null 2>&1; then
  warn "package-lock.json changed — node_modules on target is stale. Full bundle required."
fi
for f in schema.sql seed.sql; do
  if ! diff -q "$ROOT/src/lib/server/$f" "$BASELINE/src/lib/server/$f" >/dev/null 2>&1; then
    warn "src/lib/server/$f changed — target DB may need a migration."
  fi
done

if [ "$WARN" = 1 ]; then
  echo
  echo "Patch may be unsafe."
  echo "Either:"
  echo "  - run scripts/make-bundle.sh and ship the full bundle, or"
  echo "  - re-run this script with FORCE=1 if you know the change is harmless."
  if [ "${FORCE:-0}" != "1" ]; then
    exit 1
  fi
  echo "FORCE=1 set — continuing anyway."
fi

echo "==> Building production output (vite build)"
npm run build

echo "==> Staging patch contents"
rm -rf "$PATCH_DIR"
mkdir -p "$PATCH_DIR"
rsync -a --delete build/ "$PATCH_DIR/build/"

STAMP="$(date +%Y-%m-%d)"
cat > "$PATCH_DIR/UPDATE.txt" <<EOF
Замена Масла ГП — обновление программы ($STAMP)
================================================

Этот архив содержит только новую версию программы (папка build).
Ваши данные (data\\, backups\\) и установленный Node.js не затрагиваются.

Как установить обновление:

  1. Закройте чёрное окно "start.bat", если программа запущена.

  2. Распакуйте этот архив в папку C:\\avtoambor\\
     (туда же, где лежат install.bat и start.bat).
     Windows спросит, заменить ли существующие файлы — ответьте "Да"
     (или "Заменить файлы в папке назначения").

  3. Снова запустите start.bat двойным щелчком.

Если после обновления программа не запускается — напишите Давиду.
EOF

echo "==> Creating zip: $ZIP"
rm -f "$ZIP"
( cd "$PATCH_DIR" && zip -rq "$ZIP" build UPDATE.txt )

ZIP_SIZE="$(du -h "$ZIP" | cut -f1)"
echo
echo "═══════════════════════════════════════════════════════════════"
echo " Patch ready: $ZIP ($ZIP_SIZE)"
echo "═══════════════════════════════════════════════════════════════"
echo
echo " Next steps (you):"
echo "   1. Upload $ZIP to your server."
echo "   2. Send him the download link."
echo
echo " What he does (also written in UPDATE.txt inside the zip):"
echo "   1. Close the start.bat window."
echo "   2. Extract the zip into C:\\avtoambor\\ — choose Replace when asked."
echo "   3. Double-click start.bat."
echo
