import { createDbService } from '@/server/services/db.js';
import { z } from 'zod';
import * as purchaseQueries from '../../../db/queries/purchases.js';
import { sendReceipt } from '../../../email/send.js';
import type { OutboxHandler } from '../types.js';

const payloadSchema = z.object({
  purchaseId: z.string(),
  guestEmail: z.string(),
  dealTitle: z.string().optional(),
  amountPaid: z.string().optional(),
  qrPngUrl: z.string().optional(),
});

type Payload = z.infer<typeof payloadSchema>;

export const purchaseGuestEmailReceipt: OutboxHandler<Payload> = {
  type: 'purchase.guest_email_receipt',
  payloadSchema,
  async handle(ctx, payload, event) {
    if (!ctx.RESEND_API_KEY) {
      if (ctx.strict !== false) throw new Error('[outbox] RESEND_API_KEY not configured');
      console.warn(
        JSON.stringify({
          event: 'outbox_secret_missing',
          secret: 'RESEND_API_KEY',
          outboxId: event.id,
        }),
      );
      return;
    }

    const db = createDbService({ DATABASE_URL: ctx.DATABASE_URL });

    const purchase = await purchaseQueries.findEnrichedById(db, payload.purchaseId);
    if (!purchase)
      throw new Error(`[outbox] purchase not found for guest receipt: ${payload.purchaseId}`);

    const result = await sendReceipt(
      { RESEND_API_KEY: ctx.RESEND_API_KEY, RESEND_FROM_EMAIL: ctx.RESEND_FROM_EMAIL ?? '' },
      {
        to: payload.guestEmail,
        transactionId: payload.purchaseId,
        dealTitle: payload.dealTitle ?? purchase.dealTitle ?? '',
        businessName: purchase.vendorName,
        amountPaid: payload.amountPaid ?? purchase.amountPaid ?? '0',
        paymentMethod: { last4: '????', brand: 'CARD' },
        dateIso: purchase.createdAt.toISOString(),
      },
    );

    if (!result.success) throw new Error(`[outbox] sendReceipt (guest) failed: ${result.error}`);
  },
};
