import { NextRequest, NextResponse } from 'next/server';
import { z } from 'zod';
import OpenAI from 'openai';
import { jsonrepair } from 'jsonrepair';
import { getWorkspaceBySlug } from '@/lib/db/repositories';
import { getOpenRouterKey, getOpenRouterKeyOptional } from "@/core/settings";
import { withAuth } from '@/core/auth';

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

const RequestSchema = z.object({
  campaignName: z.string().optional(),
  offer: z.string().optional(),
  painPoint: z.string().optional(),
  workspaceSlug: z.string().optional(),
  briefText: z.string().optional(),
});

const TOOL: OpenAI.Chat.Completions.ChatCompletionTool = {
  type: 'function',
  function: {
    name: 'suggest_hero',
    description: 'Liefert einen Bildkompositions-Hinweis (heroBriefHint) für die Hero-Bild-Generierung via fal.ai',
    parameters: {
      type: 'object',
      required: ['heroBriefHint'],
      properties: {
        heroBriefHint: {
          type: 'string',
          description: 'Lifestyle-Szene, kein Produktshot, keine On-Image-Texte. Beschreibt Komposition, Stimmung, Licht, Tageszeit. Max 200 Zeichen.',
        },
      },
    },
  },
};

const SYSTEM = `Du bist ein Marketing-Bildregisseur. Aus einem Briefing schlägst du einen Hero-Bild-Hinweis für eine Marketing-Email vor.

# Regeln
- Lifestyle-Szene statt Produktshot — visualisiere den Nutzen, nicht das Produkt
- Keine On-Image-Texte, keine Logos, keine Schilder mit Worten
- Mood, Licht (z.B. "warmes Spätsommerlicht"), Tageszeit, Setting
- 80-200 Zeichen, ein Satz oder zwei kurze Sätze
- Sprache: matche die Sprache des Briefings (de/en)
- Workspace-Voice und Design-Style berücksichtigen wenn angegeben

# Beispiel
Brief: "Premium-Kunden-Reaktivierung mit 15% Rabatt"
Output: "Junge Frau entspannt am Laptop mit Kaffeetasse, warmes Spätsommerlicht durchs Fenster, Lifestyle-Fotografie"

Tool: suggest_hero. Nur das Feld heroBriefHint zurückgeben.`;

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' }, { status: 400 });
    }

    if (!getOpenRouterKeyOptional()) {
      return NextResponse.json({
        ok: true,
        heroBriefHint: 'Lifestyle-Szene die den Nutzen visualisiert, helle natürliche Beleuchtung, professionell aber nahbar',
        meta: { source: 'stub' },
      });
    }

    const workspace = parsed.data.workspaceSlug ? getWorkspaceBySlug(parsed.data.workspaceSlug) : undefined;
    const userMsg = [
      parsed.data.campaignName && `Kampagne: ${parsed.data.campaignName}`,
      parsed.data.offer && `Angebot: ${parsed.data.offer}`,
      parsed.data.painPoint && `Schmerzpunkt: ${parsed.data.painPoint}`,
      workspace && `Workspace: ${workspace.name}`,
      workspace?.brandVoice && `Workspace-Voice: ${workspace.brandVoice}`,
      workspace?.designStyle && `Design-Style: ${workspace.designStyle}`,
      parsed.data.briefText && `\nBrief:\n${parsed.data.briefText.slice(0, 500)}`,
    ].filter(Boolean).join('\n');

    const client = new OpenAI({
      baseURL: 'https://openrouter.ai/api/v1',
      apiKey: getOpenRouterKey(),
      defaultHeaders: {
        'HTTP-Referer': process.env.OPENROUTER_APP_URL ?? 'http://localhost:3000',
        'X-Title': process.env.OPENROUTER_APP_TITLE ?? 'MailForge',
      },
    });

    const start = Date.now();
    const completion = await client.chat.completions.create({
      model: process.env.OPENROUTER_MODEL ?? '~anthropic/claude-sonnet-latest',
      max_tokens: 500,
      messages: [
        { role: 'system', content: SYSTEM },
        { role: 'user', content: userMsg || 'Generic Marketing-Mail, B2C, conversion goal' },
      ],
      tools: [TOOL],
      tool_choice: { type: 'function', function: { name: 'suggest_hero' } },
    });

    const toolCall = completion.choices[0]?.message?.tool_calls?.[0];
    if (!toolCall || toolCall.type !== 'function') {
      throw new Error('Model returned no tool_use');
    }

    let args: { heroBriefHint?: string };
    try {
      args = JSON.parse(toolCall.function.arguments);
    } catch {
      args = JSON.parse(jsonrepair(toolCall.function.arguments));
    }

    return NextResponse.json({
      ok: true,
      heroBriefHint: args.heroBriefHint,
      meta: {
        source: 'sonnet',
        durationMs: Date.now() - start,
        tokensIn: completion.usage?.prompt_tokens,
        tokensOut: completion.usage?.completion_tokens,
      },
    });
  } catch (err) {
    console.error('[/api/suggest-hero] error:', err);
    return NextResponse.json(
      { error: err instanceof Error ? err.message : 'Internal error' },
      { status: 500 },
    );
  }
});
