/**
 * Register all fraud adapters into the global registry.
 * Import this ONCE at application startup — in each decision-point integration entry.
 * Idempotent if called multiple times (registry deduplicates by key).
 */
import { registerAdapter } from './registry.js';
import { emailCanonicalAdapter } from './adapters/email-canonical.js';
import { emailDisposableAdapter } from './adapters/email-disposable.js';
import { phoneLinetypeAdapter } from './adapters/phone-linetype.js';
import { phoneRequiredEarnAdapter } from './adapters/phone-required-earn.js';
import { identityRingAdapter } from './adapters/identity-ring.js';
import { emailCatchallDomainAdapter } from './adapters/email-catchall-domain.js';
import { botSignupAdapter } from './adapters/bot-signup.js';
import { deviceFingerprintAdapter } from './adapters/device-fingerprint.js';
import { ipClusterAdapter } from './adapters/ip-cluster.js';
import { ipReputationAdapter } from './adapters/ip-reputation.js';
import { paymentInstrumentAdapter } from './adapters/payment-instrument.js';
import { velocityConversionAdapter } from './adapters/velocity-conversion.js';
// referralGraphAdapter is intentionally NOT registered here — ring detection is
// performed offline by the nightly runReferralGraphScan cron (graph-scan.ts).
// Hot-path inline traversal is deferred (ticket: referral-graph-inline-detect).

const _registered = new Set<string>();

function once(key: string, fn: () => void) {
  if (_registered.has(key)) return;
  _registered.add(key);
  fn();
}

once('all', () => {
  registerAdapter(emailCanonicalAdapter);
  registerAdapter(emailDisposableAdapter);
  registerAdapter(phoneLinetypeAdapter);
  registerAdapter(phoneRequiredEarnAdapter);
  registerAdapter(identityRingAdapter);
  registerAdapter(emailCatchallDomainAdapter);
  registerAdapter(botSignupAdapter);
  registerAdapter(deviceFingerprintAdapter);
  registerAdapter(ipClusterAdapter);
  registerAdapter(ipReputationAdapter);
  registerAdapter(paymentInstrumentAdapter);
  registerAdapter(velocityConversionAdapter);
});
