/**
 * Sentry error monitoring.
 * Solo se inicializa cuando el usuario ha dado consentimiento de analytics
 * y solo en producción con DSN configurado. Sigue el mismo patrón de
 * consentimiento que web-vitals-client.ts.
 */
import * as Sentry from '@sentry/browser';

declare global {
  interface Window {
    __crSentryStarted?: boolean;
    /**
     * Helper global para capturar excepciones desde módulos separados
     * (ej. LetterGenerator). No-op si Sentry no está inicializado o
     * si el usuario no ha dado consentimiento.
     */
    __crCaptureException?: (_err: unknown, _context?: Record<string, unknown>) => void;
  }
}

const DSN = import.meta.env.VITE_SENTRY_DSN as string | undefined;
const CONSENT_KEY = 'cr_cookie_consent_v1';

function hasAnalyticsConsent(): boolean {
  try {
    const raw = window.localStorage?.getItem(CONSENT_KEY);
    if (!raw) return false;
    const parsed = JSON.parse(raw) as Record<string, unknown>;
    return Boolean(parsed?.statistics || parsed?.analytics);
  } catch {
    return false;
  }
}

function startSentry(): void {
  if (window.__crSentryStarted || !DSN) return;
  window.__crSentryStarted = true;

  Sentry.init({
    dsn: DSN,
    environment: 'production',
    // Sin trazas de rendimiento (0%) para no consumir quota del plan gratuito.
    tracesSampleRate: 0,
    integrations: [],
    beforeSend(event) {
      // Guard extra: descartar si el consentimiento se retiró desde la inicialización.
      if (!hasAnalyticsConsent()) return null;
      return event;
    },
  });

  // Exponer helper accesible desde módulos no-module (LetterGenerator script).
  window.__crCaptureException = (err: unknown, context?: Record<string, unknown>) => {
    if (!hasAnalyticsConsent()) return;
    Sentry.withScope((scope) => {
      if (context) scope.setExtras(context);
      Sentry.captureException(err);
    });
  };
}

// Iniciar ahora si el usuario ya dio consentimiento en una visita anterior.
if (hasAnalyticsConsent()) {
  startSentry();
}

// Iniciar cuando el usuario dé consentimiento en esta sesión.
window.addEventListener('cr:cookie-consent', (event) => {
  const detail = (event as CustomEvent<{ analytics?: boolean; statistics?: boolean }>).detail;
  if (detail?.statistics || detail?.analytics) {
    setTimeout(startSentry, 100);
  }
});
