import type { DrizzleClient } from '@/server/db/client.js';
import { insertOutboxRow } from '@/server/db/queries/outbox.js';
import type { OutboxEvent } from '@/server/db/queries/outbox.js';
import { enqueueOutbox } from '@/server/queues/outbox-producer.js';
import type { MultidealEnv } from '@/server/env.js';

export async function enqueueReferralEarnOutbox(
  db: DrizzleClient,
  purchaseId: string,
): Promise<void> {
  const { id: outboxId } = await insertOutboxRow(db, {
    aggregateType: 'purchase',
    aggregateId: purchaseId,
    eventType: 'referral.earn',
    payload: { purchaseId },
  });

  await enqueueOutbox(outboxId);
}

/** Mock checkout finalizes inline — factory journeys need commission without queue drain. */
export async function dispatchReferralEarnForPurchase(
  db: DrizzleClient,
  env: MultidealEnv,
  purchaseId: string,
): Promise<void> {
  if (env.PAYMENT_PROVIDER === 'mock') {
    const { referralEarn } = await import('@/server/workflows/outbox/handlers/referral.earn.js');
    const event = {
      id: `mock-referral-earn:${purchaseId}`,
      aggregateType: 'purchase',
      aggregateId: purchaseId,
      eventType: 'referral.earn',
      payload: { purchaseId },
      dedupeKey: null,
      retryCount: 0,
      retryLimit: 3,
      createdAt: new Date(),
      processedAt: null,
      failedAt: null,
      deadAt: null,
      lastError: null,
    } as OutboxEvent;
    await referralEarn.handle(env, { purchaseId }, event);
    return;
  }
  await enqueueReferralEarnOutbox(db, purchaseId);
}
