import type { FraudAdapter, SignupCtx, FraudSignal, AdapterConfig } from '../types.js'

// Bundled list of known disposable email domains (add to fraud_config.params.extraDomains for additions).
const BUILTIN_DISPOSABLE_DOMAINS = new Set([
  'mailinator.com', 'guerrillamail.com', 'guerrillamail.net', 'guerrillamail.de',
  'guerrillamail.org', 'guerrillamail.info', 'trashmail.com', 'trashmail.me',
  'trashmail.net', 'yopmail.com', 'yopmail.fr', 'cool.fr.nf', 'jetable.fr.nf',
  'nospam.ze.tc', 'nomail.xl.cx', 'mega.zik.dj', 'speed.1s.fr', 'courriel.fr.nf',
  'spamgourmet.com', 'dispostable.com', 'mailnull.com', 'spamspot.com',
  'throwam.com', 'throwam.net', 'fakeinbox.com', 'tempmail.com', 'temp-mail.org',
  'sharklasers.com', 'guerrillamailblock.com', 'grr.la', 'spam4.me', 'binkmail.com',
  'bob.email', 'clrmail.com', 'discard.email', 'discardmail.com', 'discardmail.de',
])

export const emailDisposableAdapter: FraudAdapter<SignupCtx> = {
  key: 'email-disposable',
  points: ['SIGNUP'],
  async evaluate(ctx: SignupCtx, cfg: AdapterConfig): Promise<FraudSignal | null> {
    if (!ctx.refereeEmail) return null
    const domain = ctx.refereeEmail.toLowerCase().split('@')[1] ?? ''
    const extraDomains: string[] = (cfg.params?.['extraDomains'] as string[]) ?? []
    const allDisposable = new Set([...BUILTIN_DISPOSABLE_DOMAINS, ...extraDomains])

    if (!allDisposable.has(domain)) return null

    return {
      adapter: 'email-disposable',
      action: 'block',
      codes: ['DISPOSABLE_EMAIL_DOMAIN'],
      detail: { domain },
    }
  },
}
