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

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

const RequestSchema = z.object({
  brandName: z.string().min(1),
  brandVoice: z.string().min(1),
  wordingStyle: z.string().optional(),
  designStyle: z.string().optional(),
  senderDomain: z.string().optional(),
  /** Aktuelle Werte (falls vorhanden) — KI nutzt sie als Kontext */
  currentHeader: z.object({ phone: z.string().optional(), tagline: z.string().optional() }).optional(),
  currentFooter: z.object({
    companyInfo: z.string().optional(),
    legalRegulations: z.string().optional(),
    complaintBodies: z.string().optional(),
  }).optional(),
  /** Zusätzlicher User-Hinweis (z.B. "wir sind Versicherungsmakler mit IHK-Reg München") */
  hint: z.string().optional(),
});

const SYSTEM_PROMPT = `Du bist Compliance-Experte für Email-Marketing und Branding für deutsche Unternehmen,
mit Schwerpunkt auf Versicherungsbranche (Versicherungsmakler nach §34d GewO,
Versicherungsvertreter, Versicherungsberater).

Aus einem Workspace-Profil generierst du strukturierte Header- und Footer-Inhalte für Marketing-Emails.

WICHTIGE COMPLIANCE-REGELN:
- Wenn das Workspace-Profil eine Versicherungsbezogene Tätigkeit andeutet (Wörter: "Versicherung",
  "Makler", "Mandant", "Vermittler", "Versicherer", "Tarif", "EVB", "Kurzzeitkennzeichen"),
  MUSST du im Footer folgendes berücksichtigen:
  * Erlaubnis nach §34d Abs.1 GewO mit Platzhalter für Erlaubnisnummer
  * IHK-Vermittlerregister-Nr. (Platzhalter D-XXXX-XXXXX-XX)
  * Aufsichtsbehörde: zuständige IHK (z.B. "IHK München" wenn aus Bayern)
  * Bei Mandantenverhältnis: Hinweis auf §59 VVG (Versicherungsmakler) und §15 VersVermV
  * Beschwerdestellen IMMER nennen: Versicherungsombudsmann e.V. (Postfach 080632, 10006 Berlin)
    UND BaFin (Graurheindorfer Str. 108, 53117 Bonn)

- Für ALLE Workspaces gilt im Footer:
  * Geschäftsführer/Inhaber (Platzhalter wenn unbekannt)
  * Handelsregister-Nr. + Registergericht (Platzhalter wenn unbekannt)
  * USt-IdNr. (Platzhalter wenn unbekannt)
  * Sitz der Gesellschaft

- Header sollte knapp sein:
  * Telefon: nur wenn typisch für die Branche (Service-Hotlines, Beratung)
  * Tagline: 1 Zeile, max ~60 Zeichen, Workspace-Voice angepasst (Sie-Form bei B2B/Versicherung)

PLATZHALTER-KONVENTION:
- Unbekannte konkrete Daten als [PLATZHALTER]-Wert: [HRB-NUMMER], [GESCHÄFTSFÜHRER], [USt-ID], [IHK-REG-NR]
- Der User füllt diese später manuell aus
- KEINE erfundenen Nummern oder Adressen halluzinieren

OUTPUT-FORMAT:
Strenges JSON via Tool-Use. Verwende \\n für Zeilenumbrüche in mehrzeiligen Texten.`;

const TOOL_DEFINITION = {
  type: 'function' as const,
  function: {
    name: 'suggest_branding',
    description: 'Strukturierte Header/Footer-Vorschläge für eine Workspace',
    parameters: {
      type: 'object',
      required: ['header', 'footer', 'isInsuranceRelated', 'reasoning'],
      properties: {
        isInsuranceRelated: {
          type: 'boolean',
          description: 'true wenn das Workspace zur Versicherungsbranche gehört (löst Pflichtangaben aus)',
        },
        header: {
          type: 'object',
          required: ['phone', 'tagline'],
          properties: {
            phone: {
              type: 'string',
              description: 'Telefonnummer im Header oder leer wenn nicht passend (z.B. Format "+49 89 12345-67")',
            },
            tagline: {
              type: 'string',
              description: 'Kurze Tagline unter dem Logo (max 60 Zeichen, Workspace-Voice angepasst)',
            },
          },
        },
        footer: {
          type: 'object',
          required: ['companyInfo', 'legalRegulations', 'complaintBodies'],
          properties: {
            companyInfo: {
              type: 'string',
              description: 'Gesellschaftsdaten — Geschäftsführer, HRB, USt-ID, Sitz. Mehrzeilig mit \\n.',
            },
            legalRegulations: {
              type: 'string',
              description: 'Versicherungsmakler-Compliance (§34d GewO, IHK-Reg, §59 VVG). Leer wenn nicht-Versicherung. Mehrzeilig mit \\n.',
            },
            complaintBodies: {
              type: 'string',
              description: 'Beschwerdestellen — Ombudsmann, BaFin. Pflicht bei Versicherungs-Workspaces. Mehrzeilig mit \\n.',
            },
          },
        },
        reasoning: {
          type: 'string',
          description: 'Kurze Begründung warum diese Inhalte gewählt wurden (1-3 Sätze)',
        },
      },
    },
  },
};

const MODEL = 'anthropic/claude-sonnet-4.6';
const MAX_TOKENS = 2500;

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 userBrief = [
      `# Workspace`,
      `Name: ${parsed.data.brandName}`,
      `Sender-Domain: ${parsed.data.senderDomain ?? '(unbekannt)'}`,
      ``,
      `# Voice & Style`,
      `Workspace-Voice: ${parsed.data.brandVoice}`,
      parsed.data.wordingStyle ? `Wording: ${parsed.data.wordingStyle}` : '',
      parsed.data.designStyle ? `Design: ${parsed.data.designStyle}` : '',
      ``,
      parsed.data.hint ? `# User-Hinweis\n${parsed.data.hint}\n` : '',
      `# Aktuelle Werte (falls vorhanden — als Ausgangspunkt für Verfeinerung)`,
      `Header-Phone: ${parsed.data.currentHeader?.phone ?? '(leer)'}`,
      `Header-Tagline: ${parsed.data.currentHeader?.tagline ?? '(leer)'}`,
      `Footer-Company: ${parsed.data.currentFooter?.companyInfo ?? '(leer)'}`,
      `Footer-Legal: ${parsed.data.currentFooter?.legalRegulations ?? '(leer)'}`,
      `Footer-Beschwerden: ${parsed.data.currentFooter?.complaintBodies ?? '(leer)'}`,
    ].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 ?? MODEL,
      max_tokens: MAX_TOKENS,
      messages: [
        { role: 'system', content: SYSTEM_PROMPT },
        { role: 'user', content: userBrief },
      ],
      tools: [TOOL_DEFINITION],
      tool_choice: { type: 'function', function: { name: 'suggest_branding' } },
    });

    const choice = completion.choices[0];
    const toolCall = choice?.message?.tool_calls?.[0];
    if (!toolCall || toolCall.type !== 'function') {
      return NextResponse.json({
        error: `Modell hat suggest_branding nicht aufgerufen (finish_reason=${choice?.finish_reason})`,
      }, { status: 502 });
    }

    if (choice.finish_reason === 'length') {
      return NextResponse.json({
        error: `Output abgeschnitten (max_tokens=${MAX_TOKENS}). Bitte hint kürzer halten.`,
      }, { status: 502 });
    }

    let args: Record<string, unknown>;
    try {
      args = JSON.parse(toolCall.function.arguments) as Record<string, unknown>;
    } catch {
      args = JSON.parse(jsonrepair(toolCall.function.arguments)) as Record<string, unknown>;
    }

    return NextResponse.json({
      ok: true,
      ...args,
      meta: { durationMs: Date.now() - start, model: completion.model },
    });
  } catch (err) {
    console.error('[/api/workspaces/suggest-branding] error:', err);
    return NextResponse.json(
      { error: err instanceof Error ? err.message : 'Internal error' },
      { status: 500 },
    );
  }
});
