"""Agent to build a structured topic from extracted link content."""
import json
from typing import Any, Dict

from loguru import logger

from src.agents.base import BaseAgent


class LinkTopicBuilderAgent(BaseAgent):
    """Build a structured topic dictionary from link content."""

    def __init__(self) -> None:
        super().__init__("link_topic_builder")

    async def process(self, source: Dict[str, Any]) -> Dict[str, Any]:
        content = source.get("text", "")
        source_url = source.get("source_url", "")
        source_type = source.get("source_type", "web")
        source_title = source.get("title", "")

        if not content or len(content.strip()) < 200:
            raise ValueError("Zu wenig Inhalt, um ein sinnvolles Topic zu erstellen.")

        # Keep content length reasonable for the model
        max_chars = 12000
        if len(content) > max_chars:
            content = content[:max_chars]

        system_prompt = """Du bist ein Assistent, der aus einem Link-Inhalt ein strukturiertes Topic für einen LinkedIn-Post erstellt.

Gib NUR valides JSON zurück (keine Erklärungen)."""

        user_prompt = f"""Quelle:
- Typ: {source_type}
- Titel: {source_title}
- URL: {source_url}

Inhalt:
\"\"\"{content}\"\"\"

        Erstelle ein Topic im folgenden JSON-Format:
{{
  "title": "Kurzer, präziser Titel (max 80 Zeichen)",
  "summary": "Detaillierte, vollumfängliche Zusammenfassung (8-12 Sätze, alle Hauptpunkte abdecken)",
  "extended_summary": "Längere Zusammenfassung (150-250 Wörter) mit Kontext, Kernaussagen, Belegen und Implikationen",
  "outline": ["Abschnitt 1: ...", "Abschnitt 2: ...", "..."],
  "fact": "1-2 Sätze als Kernaussage/Fakt",
  "key_points": ["Punkt 1", "Punkt 2", "..."],
  "key_facts": ["Konkreter Fakt 1", "Konkreter Fakt 2", "..."],
  "quotes": ["Kurzes Zitat falls sinnvoll", "..."],
  "relevance": "Warum ist das für die Zielgruppe relevant? (1 Satz)",
  "category": "Link",
  "source": "{source_url}",
  "source_title": "{source_title}",
  "source_type": "{source_type}"
}}

Regeln:
- Halte dich an das JSON-Format.
- Keine erfundenen Fakten: nutze NUR den gegebenen Inhalt.
- Wenn keine Zitate vorhanden sind, gib ein leeres Array zurück.
- Summary und extended_summary müssen unterschiedliche Detailtiefe haben.
"""

        result = await self.call_openai(
            system_prompt=system_prompt,
            user_prompt=user_prompt,
            model="gpt-4o",
            temperature=0.2,
            response_format={"type": "json_object"}
        )

        try:
            topic = json.loads(result)
        except Exception as exc:
            logger.warning(f"Failed to parse topic JSON: {exc}")
            raise ValueError("Antwort konnte nicht verarbeitet werden.")

        # Ensure required fields exist
        topic.setdefault("category", "Link")
        topic.setdefault("source", source_url)
        topic.setdefault("source_title", source_title)
        topic.setdefault("source_type", source_type)
        topic.setdefault("title", source_title or "Link-Thema")
        topic.setdefault("summary", "")
        topic.setdefault("extended_summary", "")
        topic.setdefault("outline", [])
        topic.setdefault("fact", topic.get("summary", "")[:300])
        topic.setdefault("key_points", [])
        topic.setdefault("key_facts", [])
        topic.setdefault("quotes", [])
        topic.setdefault("relevance", "Relevantes Thema für die Zielgruppe")

        return topic
