#!/usr/bin/env bash
# Point d'entrée dev de SEO Insight AVEC Firecrawl branché.
#
# Enchaîne, dans l'ordre :
#   1. garantit le tunnel SSH vers l'instance Firecrawl (loopback distant
#      127.0.0.1:3002 → loopback Mac), via l'alias `crawl-tunnel` de ~/.ssh/config ;
#   2. lance `dev-all.sh` (app Next + service analytics ETL) — qui a ses propres
#      préflights (pnpm/typescript/kysely/postgres).
#
# Le service analytics lit FIRECRAWL_API_URL/FIRECRAWL_API_KEY depuis .env.local
# ; avec le tunnel actif, `firecrawlConfigured()` = true et les jobs crawl-onpage
# + le corpus sémantique passent par Firecrawl, config IDENTIQUE à la prod.
#
# Usage :
#   ./scripts/dev-firecrawl.sh            # tunnel + dev-all
#   ./scripts/dev-firecrawl.sh --enqueue <keywordId> [siteId]
#                                          # enfile un job crawl-onpage sur le
#                                          # service local (POST :8787/jobs)
set -euo pipefail
cd "$(dirname "$0")/.."

FIRECRAWL_PORT=3002
ANALYTICS_PORT=8787

tunnel_up() {
  # Le tunnel est là si quelque chose écoute en loopback sur 3002 ET répond.
  curl -fsS --max-time 3 "http://127.0.0.1:${FIRECRAWL_PORT}/" >/dev/null 2>&1
}

ensure_tunnel() {
  if tunnel_up; then
    echo "[dev-firecrawl] tunnel Firecrawl déjà actif sur :${FIRECRAWL_PORT}"
    return 0
  fi
  echo "[dev-firecrawl] tunnel Firecrawl absent — ouverture (ssh -fN crawl-tunnel)…"
  # crawl-tunnel : alias dans ~/.ssh/config (LocalForward 3002 127.0.0.1:3002).
  if ! ssh -fN crawl-tunnel 2>/dev/null; then
    echo "[dev-firecrawl] ✗ impossible d'ouvrir le tunnel." >&2
    echo "[dev-firecrawl]   Vérifie l'entrée 'Host crawl-tunnel' dans ~/.ssh/config" >&2
    echo "[dev-firecrawl]   et que ta clé SSH est autorisée sur le serveur." >&2
    exit 1
  fi
  # Laisse le forward s'établir puis confirme.
  for _ in 1 2 3 4 5; do
    if tunnel_up; then
      echo "[dev-firecrawl] ✓ tunnel Firecrawl établi sur :${FIRECRAWL_PORT}"
      return 0
    fi
    sleep 1
  done
  echo "[dev-firecrawl] ✗ tunnel ouvert mais Firecrawl ne répond pas sur :${FIRECRAWL_PORT}." >&2
  echo "[dev-firecrawl]   L'instance Docker tourne-t-elle sur le serveur ?" >&2
  exit 1
}

# --- Mode helper : enfile un job crawl-onpage sur le service analytics local ---
if [ "${1:-}" = "--enqueue" ]; then
  kw="${2:?usage: --enqueue <keywordId> [siteId]}"
  site="${3:-}"
  if [ -z "$site" ]; then
    # Convention : keywordId = "<siteId>-<slug>". Le siteId est un UUID (5 groupes).
    site="$(printf '%s' "$kw" | grep -oE '^[0-9a-f-]{36}' || true)"
    [ -n "$site" ] || { echo "[dev-firecrawl] siteId introuvable dans '$kw' — passe-le en 3e argument." >&2; exit 1; }
  fi
  echo "[dev-firecrawl] enqueue crawl-onpage keyword=$kw site=$site"
  curl -fsS -X POST "http://127.0.0.1:${ANALYTICS_PORT}/jobs" \
    -H 'content-type: application/json' \
    -d "{\"type\":\"crawl-onpage\",\"siteId\":\"$site\",\"payload\":{\"keywordId\":\"$kw\"}}"
  echo
  exit 0
fi

# --- Mode normal : tunnel + stack dev ---
ensure_tunnel
echo "[dev-firecrawl] → lancement de la stack dev (app + analytics)…"
exec ./scripts/dev-all.sh
