// @sentry/cloudflare is lazy-loaded on first withSentry call.
// Static top-level import blew the Bundled-tier 10ms CPU ceiling at cold-start.
import { captureCaught } from './capture.server';
import type * as SentryCloudflare from '@sentry/cloudflare';

type Kind = 'queue' | 'alarm' | 'cron' | 'ai-agent' | 'outbox';

let sentryPromise: Promise<typeof SentryCloudflare> | null = null;

function getSentry(): Promise<typeof SentryCloudflare> {
  return (sentryPromise ??= import('@sentry/cloudflare'));
}

export function withSentry<TArgs extends unknown[], TRet>(
  handler: (...args: TArgs) => Promise<TRet>,
  opts: { name: string; kind: Kind },
): (...args: TArgs) => Promise<TRet> {
  return async (...args: TArgs): Promise<TRet> => {
    const Sentry = await getSentry();
    return Sentry.startSpan({ name: opts.name, op: opts.kind }, async () => {
      try {
        return await handler(...args);
      } catch (err) {
        captureCaught(err, { scope: `${opts.kind}.${opts.name}`, severity: 'error' });
        throw err;
      }
    });
  };
}
