// Sentry server-side init (Cloudflare Workers runtime, via @sentry/cloudflare).
// This file is imported by the @sentry/astro integration at build time and
// must be keep tree-shakeable and free of non-Workers-compatible imports.

import * as Sentry from '@sentry/astro';

// Only initialize Sentry if a DSN is actually configured. Sentry 10 can throw
// at module-load time when the DSN is empty, which hard-fails the Worker
// before it ever enters the fetch handler.
const dsn = process.env.SENTRY_DSN;
if (dsn) {
  Sentry.init({
    dsn,
    environment: process.env.ENVIRONMENT ?? 'development',
    tracesSampleRate: 0.1,
    // PII scrubber - denylist of fields that must never leave the server
    beforeSend(event) {
      const deny = ['phone', 'email', 'address', 'display_name', 'ip', 'full_name'];
      const scrub = (obj: unknown): unknown => {
        if (!obj || typeof obj !== 'object') return obj;
        if (Array.isArray(obj)) return obj.map(scrub);
        const out: Record<string, unknown> = {};
        for (const [k, v] of Object.entries(obj as Record<string, unknown>)) {
          out[k] = deny.includes(k) ? '[scrubbed]' : scrub(v);
        }
        return out;
      };
      if (event.request) event.request = scrub(event.request) as typeof event.request;
      if (event.extra) event.extra = scrub(event.extra) as typeof event.extra;
      if (event.contexts) event.contexts = scrub(event.contexts) as typeof event.contexts;
      return event;
    },
  });
}
