import { createDbService } from '@/server/services/db.js';
import { z } from 'zod';
import { eq } from 'drizzle-orm';
import { users, vendors } from '../../../db/schema.js';
import { signUnsubscribeToken } from '../../../email/marketing-token.js';
import { sendVendorWelcomeMarketing } from '../../../email/send.js';
import { decryptUserEmail } from '../_helpers/decrypt-email.js';
import type { OutboxHandler } from '../types.js';

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

type Payload = z.infer<typeof payloadSchema>;

export const vendorWelcomeDay0: OutboxHandler<Payload> = {
  type: 'vendor.welcome.day0',
  payloadSchema,
  async handle(ctx, payload, event) {
    if (!ctx.RESEND_API_KEY || !ctx.RESEND_MARKETING_FROM_EMAIL) {
      console.warn(
        JSON.stringify({
          event: 'outbox_secret_missing',
          secret: 'RESEND_MARKETING_FROM_EMAIL',
          outboxId: event.id,
        }),
      );
      return;
    }

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

    const [userRow] = await db
      .select({ notifPrefs: users.notifPrefs })
      .from(users)
      .where(eq(users.id, payload.userId))
      .limit(1);

    if (userRow?.notifPrefs?.marketing?.all !== true) return;

    const toEmail = await decryptUserEmail(ctx, payload.userId);
    if (!toEmail) {
      console.warn(JSON.stringify({ event: 'outbox_email_decrypt_failed', outboxId: event.id }));
      return;
    }

    const [vendorRow] = await db
      .select({ displayName: vendors.displayName })
      .from(vendors)
      .where(eq(vendors.id, payload.vendorId))
      .limit(1);

    const siteUrl = ctx.PUBLIC_SITE_URL ?? 'https://multi.deal';
    const unsubscribeUrl = await signUnsubscribeToken(payload.userId, ctx.JWT_SECRET!, siteUrl);
    const dashboardUrl = `${siteUrl}/vendor/dashboard`;

    const mEnv = {
      RESEND_API_KEY: ctx.RESEND_API_KEY,
      RESEND_MARKETING_FROM_EMAIL: ctx.RESEND_MARKETING_FROM_EMAIL,
    };

    const result = await sendVendorWelcomeMarketing(mEnv, {
      to: toEmail,
      vendorName: vendorRow?.displayName ?? undefined,
      dashboardUrl,
      unsubscribeUrl,
      locale: 'he',
    });

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