#!/usr/bin/env bash
# `bun dev` = Next app + service analytics ETL ensemble. L'import CSV lourd passe
# exclusivement par le service DuckDB : il doit tourner en dev, sinon la route
# /keywords/import-heavy répond 502 « fetch failed ».
#
# Le service lit R2 + DATABASE_URL depuis .env.local ; l'app Next pointe
# ANALYTICS_URL dessus (défaut http://localhost:8787).
set -euo pipefail
cd "$(dirname "$0")/.."

# --- Préflight : fail fast si l'install est corrompue, plutôt que laisser Next
# partir dans son auto-install pnpm (incident du 2026-07-16 : bun update --latest
# → typescript@7 sans API JS → Next croit TS absent → pnpm réécrit node_modules
# en layout .pnpm et perd les overrides kysely/zod).
if [ -e pnpm-lock.yaml ] || [ -d node_modules/.pnpm ]; then
  echo "[dev-all] ✗ node_modules contaminé par pnpm (auto-install Next). Répare :" >&2
  echo "[dev-all]   rm -rf node_modules pnpm-lock.yaml && bun install" >&2
  exit 1
fi
if [ ! -f node_modules/typescript/lib/typescript.js ]; then
  echo "[dev-all] ✗ typescript installé sans API compiler JS (typescript@7 natif ?)." >&2
  echo "[dev-all]   Next ne peut pas démarrer avec. Garde typescript en ^6 dans package.json puis : bun install" >&2
  exit 1
fi
kysely_expected=$(bun -e 'console.log(require("./package.json").overrides.kysely)')
kysely_installed=$(bun -e 'console.log(require("./node_modules/kysely/package.json").version)' 2>/dev/null || echo absent)
if [ "$kysely_installed" != "$kysely_expected" ]; then
  echo "[dev-all] ✗ kysely=$kysely_installed ≠ override $kysely_expected (pin better-auth perdu). Lance : bun install" >&2
  exit 1
fi
# Postgres down = toutes les pages en ECONNREFUSED avec des symptômes trompeurs.
# Cas connu post-reboot : postmaster.pid orphelin (PID réutilisé par un process
# système) → le service boucle en erreur. Avertit sans bloquer.
if ! pg_isready -q 2>/dev/null; then
  echo "[dev-all] ⚠ Postgres injoignable sur :5432 — l'app va répondre en erreur partout." >&2
  echo "[dev-all]   Diagnostic : tail /opt/homebrew/var/log/postgresql@18.log" >&2
  echo "[dev-all]   Si « postmaster.pid already exists » après un reboot :" >&2
  echo "[dev-all]   rm /opt/homebrew/var/postgresql@18/postmaster.pid && brew services restart postgresql@18" >&2
fi

# Tue le groupe de process à la sortie (Ctrl-C, erreur) pour ne laisser aucun
# enfant orphelin tenir un port.
trap 'kill 0' EXIT

# Un service analytics tourne déjà (session précédente, autre terminal) ? On le
# réutilise au lieu de crasher sur EADDRINUSE — ce qui, avec set -e + trap,
# tuerait aussi Next.
if lsof -nP -iTCP:8787 -sTCP:LISTEN >/dev/null 2>&1; then
  echo "[dev-all] service analytics déjà actif sur :8787 — réutilisé"
else
  bun run dev:analytics &
fi

bun run dev:next &
wait
