import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import { generateHeroImage } from '@/modules/briefing/lib/hero-image';
import { getWorkspaceBySlug } from '@/lib/db/repositories';
import { getPublicBaseUrl } from '@/modules/sending/lib/public-base-url';
import { withAuth } from '@/core/auth';

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

/**
 * Regeneriert das Hero-Bild für eine bestehende Campaign/Variante.
 *
 * Im Gegensatz zu `/api/generate` (full pipeline) kümmert sich dieser Endpoint NUR um
 * das Bild — Strategy, MJML, Spam-Check bleiben unverändert. Frontend triggert anschließend
 * `/api/render` mit der neuen `heroUrl` damit das HTML aktualisiert wird.
 *
 * `forceRegenerate: true` ist Default — User klickt explizit „Neu generieren", soll also
 * frisches Bild bekommen auch wenn der Prompt-Hash zufällig den gleichen Cache-Hit hätte.
 */
const RequestSchema = z.object({
  imageBrief: z.string().min(10, 'Image-Brief muss mind. 10 Zeichen haben'),
  workspaceSlug: z.string(),
  aspectRatio: z.enum(['16:9', '3:2', '4:3', '1:1']).optional(),
});

export const POST = withAuth(async (req: NextRequest, _ctx) => {
  try {
    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('.')}: ${i.message}`),
      }, { status: 400 });
    }

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

    const baseUrl = getPublicBaseUrl(req);
    const hero = await generateHeroImage(
      {
        imageBrief: parsed.data.imageBrief,
        brandPrimaryColor: workspace.primaryColor,
        brandName: workspace.name,
        aspectRatio: parsed.data.aspectRatio ?? '3:2',
        forceRegenerate: true, // User-getriggert → Cache umgehen
      },
      baseUrl,
    );

    return NextResponse.json({
      ok: true,
      hero: {
        url: hero.url,
        absoluteUrl: hero.absoluteUrl,
        bytes: hero.bytes,
        durationMs: hero.durationMs,
        prompt: hero.prompt,
      },
    });
  } catch (err) {
    console.error('[/api/regenerate-hero] error:', err);
    return NextResponse.json(
      { error: err instanceof Error ? err.message : 'Internal error' },
      { status: 500 },
    );
  }
});
