import { createDbService } from '@/server/services/db.js';
import { z } from 'zod';
import { sendToUser } from '../../../push/send.js';
import { buildSupportPushNotif } from '../_helpers/support-push.js';
import type { OutboxHandler } from '../types.js';

const payloadSchema = z.object({
  userId: z.string(),
  templateKey: z.string().optional(),
  params: z.record(z.string(), z.string()).optional(),
  locale: z.enum(['he', 'en']).optional(),
});

type Payload = z.infer<typeof payloadSchema>;

export const supportNotifPush: OutboxHandler<Payload> = {
  type: 'support.notif.push',
  payloadSchema,
  async handle(ctx, payload, event) {
    if (!ctx.VAPID_PUBLIC_KEY || !ctx.VAPID_PRIVATE_KEY || !ctx.VAPID_SUBJECT) {
      if (ctx.strict !== false)
        throw new Error('[outbox] VAPID keys not configured for support.notif.push');
      console.warn(
        JSON.stringify({
          event: 'outbox_secret_missing',
          secret: 'VAPID_KEYS',
          outboxId: event.id,
        }),
      );
      return;
    }

    const templateKey = payload.templateKey ?? 'support.ticket_opened';
    const params = payload.params ?? {};
    const locale = payload.locale ?? 'he';

    const { title, body, url } = buildSupportPushNotif(templateKey, params, locale);

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

    try {
      await sendToUser(
        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.userId,
        {
          title,
          body,
          url,
          tag: `support-${templateKey}-${params['ticketId'] ?? event.id}`,
          data: { templateKey, ticketId: params['ticketId'] },
        },
        'team_message',
      );
    } catch (err) {
      console.warn(
        JSON.stringify({
          event: 'outbox_support_push_failed',
          userId: payload.userId,
          templateKey,
          error: err instanceof Error ? err.message : String(err),
          outboxId: event.id,
        }),
      );
    }
  },
};
