import { fraudEvents } from '@/server/db/schema.js';
import type { DrizzleClient } from '@/server/db/client';
import type { FraudSignal, DecisionPoint } from '@/server/referrals/fraud/types.js';
import { toStoredDecisionPoint } from '@/server/referrals/fraud/types.js';
import { asReferralId } from '@/server/platform-seams/ids.js';

export interface InsertFraudEventInput {
  userId: string;
  referralId?: string;
  decisionPoint: DecisionPoint;
  signal: FraudSignal;
}

export async function insertFraudEvent(
  db: DrizzleClient,
  input: InsertFraudEventInput,
): Promise<string | null> {
  const [row] = await db
    .insert(fraudEvents)
    .values({
      userId: input.userId,
      referralId: input.referralId ? asReferralId(input.referralId) : null,
      decisionPoint: toStoredDecisionPoint(input.decisionPoint),
      adapter: input.signal.adapter,
      action: input.signal.action,
      codes: input.signal.codes,
      detail: input.signal.detail ?? null,
    })
    .onConflictDoNothing()
    .returning({ id: fraudEvents.id });
  return row?.id ?? null;
}
