/**
 * Seed helpers for fraud integration tests.
 */
import { sql } from 'drizzle-orm'
import type { TestDb } from './pglite-db.js'

// ─── Users ────────────────────────────────────────────────────────────────────

export async function createUser(
  db: TestDb,
  overrides?: Partial<{ email: string; accountState: string }>,
): Promise<{ id: string; email: string }> {
  const id = crypto.randomUUID()
  const email = overrides?.email ?? `user-${id.slice(0, 8)}@example.com`
  const accountState = overrides?.accountState ?? 'ACTIVE'

  await db.execute(sql`
    INSERT INTO users (id, email, email_index, account_state)
    VALUES (${id}, ${email}, ${email.toLowerCase()}, ${accountState})
  `)

  return { id, email }
}

// ─── Referral Links ───────────────────────────────────────────────────────────

export async function createReferralLink(
  db: TestDb,
  ownerUserId: string,
  overrides?: Partial<{ code: string; kind: string }>,
): Promise<{ id: string; code: string }> {
  const id = crypto.randomUUID()
  const code = overrides?.code ?? `code-${id.slice(0, 8)}`
  const kind = overrides?.kind ?? 'referral'

  await db.execute(sql`
    INSERT INTO referral_links (id, owner_user_id, code, kind)
    VALUES (${id}, ${ownerUserId}, ${code}, ${kind})
  `)

  return { id, code }
}

// ─── Referrals ────────────────────────────────────────────────────────────────

export async function createReferral(
  db: TestDb,
  args: { referrerUserId: string; refereeUserId: string; linkId: string },
): Promise<{ id: string }> {
  const id = crypto.randomUUID()

  await db.execute(sql`
    INSERT INTO referrals (id, referrer_user_id, referee_user_id, link_id, kind, status)
    VALUES (${id}, ${args.referrerUserId}, ${args.refereeUserId}, ${args.linkId}, 'referral', 'pending')
  `)

  return { id }
}

// ─── Referral Settings ────────────────────────────────────────────────────────

/**
 * Insert the default referral_settings row (id = 1).
 * Safe to call multiple times — ON CONFLICT DO NOTHING.
 */
export async function seedReferralSettings(db: TestDb): Promise<void> {
  await db.execute(sql`
    INSERT INTO referral_settings (id)
    VALUES (1)
    ON CONFLICT (id) DO NOTHING
  `)
}
