import { createDbService } from '@/server/services/db.js';
import { z } from 'zod';
import { ensureMembership } from '../../../db/queries/club.js';
import { sendToVendor } from '../../../push/send.js';
import type { OutboxHandler } from '../types.js';
import { he } from '@/lib/i18n/he';

const payloadSchema = z.object({
  userId: z.string(),
  vendorId: z.string(),
  purchaseId: z.string(),
});

type Payload = z.infer<typeof payloadSchema>;

export const clubMembershipCreate: OutboxHandler<Payload> = {
  type: 'club_membership.create',
  payloadSchema,
  async handle(ctx, payload, _event) {
    const db = createDbService({ DATABASE_URL: ctx.DATABASE_URL });

    // 1. Upsert club membership (idempotent)
    await ensureMembership(db, payload.userId, payload.vendorId, payload.purchaseId);

    // 2. Send push notification to vendor for the new sale (best-effort)
    if (ctx.VAPID_PUBLIC_KEY && ctx.VAPID_PRIVATE_KEY && ctx.VAPID_SUBJECT) {
      try {
        await sendToVendor(
          db,
          {
            VAPID_PUBLIC_KEY: ctx.VAPID_PUBLIC_KEY,
            VAPID_PRIVATE_KEY: ctx.VAPID_PRIVATE_KEY,
            VAPID_SUBJECT: ctx.VAPID_SUBJECT,
            DATABASE_URL: ctx.DATABASE_URL,
          },
          payload.vendorId,
          {
            title: he.vendor_notifications_settings.new_sale_push_title,
            body: he.vendor_notifications_settings.new_sale_push_body,
            url: '/vendor/dashboard',
            tag: `sale-${payload.purchaseId}`,
            data: { purchaseId: payload.purchaseId },
          },
          'vendor_every_sale',
        );
      } catch (err) {
        // Push is best-effort — log but do not fail the outbox event.
        console.warn(
          JSON.stringify({
            event: 'outbox_vendor_push_failed',
            vendorId: payload.vendorId,
            error: err instanceof Error ? err.message : String(err),
          }),
        );
      }
    }
  },
};
