import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import { renderMjml } from '@/modules/editor/lib/render-mjml';
import { runPreflight } from '@/modules/spam-check/lib/preflight';
import { getWorkspaceBySlug } from '@/lib/db/repositories';
import { withAuth } from '@/core/auth';

export const runtime = 'nodejs';
export const dynamic = 'force-dynamic';

/**
 * Schlanker Re-Render-Endpoint für den manuellen MJML-Editor im AdMail-Tab.
 *
 * Anders als `/api/render` baut dieser Endpoint **kein** MJML aus Strategy —
 * er nimmt rohes MJML vom Client (User hat es im Editor angepasst) und
 * kompiliert es 1:1 zu HTML. Das erlaubt manuelle Eingriffe ohne dass die
 * Strategy → MJML Pipeline drüberbügelt.
 *
 * Subject/Preheader bleiben Teil der Strategy und werden für den Spam-Check
 * mitgereicht — sie sind im MJML-Body kein gerendertes Element.
 */
const RequestSchema = z.object({
  mjml: z.string().min(20).max(500_000),
  workspaceSlug: z.string().min(1),
  subject: z.string().min(1),
  preheader: z.string().optional(),
});

export const POST = withAuth(async (req: NextRequest, _ctx) => {
  try {
    const start = Date.now();
    const body = await req.json();
    const parsed = RequestSchema.safeParse(body);
    if (!parsed.success) {
      return NextResponse.json(
        {
          error: 'Invalid input',
          issues: parsed.error.issues.map((i) => `${i.path.join('.') || '(root)'}: ${i.message}`),
        },
        { status: 400 },
      );
    }

    const { mjml, workspaceSlug, subject, preheader } = parsed.data;
    const workspace = getWorkspaceBySlug(workspaceSlug);
    if (!workspace) {
      return NextResponse.json({ error: `Unknown workspace: ${workspaceSlug}` }, { status: 400 });
    }

    const rendered = await renderMjml(mjml);

    const spam = runPreflight({
      html: rendered.html,
      text: rendered.text,
      subject,
      preheader,
      hasListUnsubscribeHeader: true,
      brandTerms: [workspace.name.toUpperCase()],
    });

    return NextResponse.json({
      ok: true,
      mjml,
      html: rendered.html,
      text: rendered.text,
      htmlBytes: rendered.bytes,
      mjmlErrors: rendered.errors,
      spam,
      meta: { durationMs: Date.now() - start, source: 'manual-mjml' },
    });
  } catch (err) {
    console.error('[/api/render-mjml] error:', err);
    return NextResponse.json(
      { error: err instanceof Error ? err.message : 'Internal error' },
      { status: 500 },
    );
  }
});
