#!/usr/bin/env bash
# deploy.sh — typecheck, build, deploy to preview (dev.multi.deal), push.
# Usage: scripts/deploy.sh "commit message"
set -euo pipefail

MSG="${1:?Usage: scripts/deploy.sh \"commit message\"}"

ROOT="$(git rev-parse --show-toplevel)"
cd "$ROOT"
WEB_DIR="$(cd "$ROOT/apps/web" && pwd)"

fatal() {
  echo "FATAL: $1" >&2
  exit 1
}

verify_deploy_dist() {
  DEPLOY_WEB_DIR="$WEB_DIR" node "$WEB_DIR/scripts/verify-deploy-dist.mjs" "$@"
}

verify_worker_config() {
  node "$ROOT/scripts/verify-worker-config.mjs"
}

verify_scheduler_armed() {
  local base_url="${DEPLOY_URL:-https://dev.multi.deal}"
  local cron_secret="${CRON_SECRET:-}"
  [[ -n "$cron_secret" ]] || fatal "CRON_SECRET is required for scheduler post-deploy gate"

  DEPLOY_URL="$base_url" CRON_SECRET="$cron_secret" \
    node "$ROOT/scripts/verify-scheduler-armed.mjs"
}

echo "=== typecheck ==="
cd "$WEB_DIR"
pnpm typecheck
cd "$ROOT"

echo "=== build ==="
echo "wiping stale dist at $WEB_DIR/dist"
rm -rf "$WEB_DIR/dist"
cd "$WEB_DIR"
pnpm build
verify_deploy_dist --write-stamp
verify_worker_config
cd "$ROOT"

echo "=== commit ==="
if [[ -n "$(git status --porcelain)" ]]; then
  git add -A
  git commit -m "$MSG"
else
  echo "working tree clean; deploying existing HEAD"
fi

echo "=== push ==="
git push

echo "=== deploy ==="
cd "$WEB_DIR"
verify_deploy_dist
pnpm deploy:preview
cd "$ROOT"

# Rollback runbook: (1) POST /api/internal/scheduler/disarm; (2) revert commit;
# (3) redeploy with the 4 original crons. Disarm first: a self-re-arming alarm
# plus reverted native crons would double-dispatch money and email indefinitely.
verify_scheduler_armed

echo "=== done — live at https://dev.multi.deal ==="
