"""VersicherungsCrew — DACH-spezialisierter Vergleich, offline + §34d-neutral.

Generated by ``cognithor init --template versicherungs-vergleich``.

Compliance-Profil:
  * ``tools=[]``  —  kein Netzwerkzugriff, vollstaendig offline-faehig.
  * ``no_pii()``  —  blockt E-Mails, IBANs, Telefon, Steuer-IDs im Output.
  * ``StringGuardrail(...)``  —  LLM-geprueft: keine Empfehlung, nur Vergleich.
"""

from __future__ import annotations

from cognithor.crew import Crew, CrewAgent, CrewProcess, CrewTask
from cognithor.crew.decorators import agent, crew, task
from cognithor.crew.guardrails import StringGuardrail, chain, no_pii


class VersicherungsCrew:
    """DACH-spezialisiert, offline-faehig, DSGVO-konform.

    §34d-neutral: Information nicht Beratung. no_pii() + StringGuardrail
    stellen sicher, dass Output keine PII leakt UND keine Empfehlung ausspricht.
    """

    def __init__(self, ollama_client=None):
        self._ollama_client = ollama_client

    @agent
    def tarif_researcher(self) -> CrewAgent:
        return CrewAgent(
            role="Tarif-Researcher",
            goal="Vergleiche PKV/BU-Tarife strukturiert",
            backstory="Erfahrener Makler mit §34d-Zulassung, DSGVO-bewusst.",
            tools=[],
            llm="ollama/qwen3:8b",
            memory=True,
        )

    @agent
    def kunden_profiler(self) -> CrewAgent:
        return CrewAgent(
            role="Kunden-Profiler",
            goal="Extrahiere relevante Kundenprofil-Eckdaten aus dem Input",
            backstory="Spezialist fuer strukturierte Profilerfassung, datensparsam.",
            tools=[],
            llm="ollama/qwen3:8b",
        )

    @agent
    def empfehlungs_writer(self) -> CrewAgent:
        return CrewAgent(
            role="Empfehlungs-Writer",
            goal="Schreibe einen neutralen Vergleich (keine Empfehlung)",
            backstory="Compliance-bewusster Text-Spezialist, §34d-neutral.",
            tools=[],
            llm="ollama/qwen3:8b",
        )

    @task
    def research(self) -> CrewTask:
        return CrewTask(
            description="Recherchiere Top-3-Tarife fuer: {topic}",
            expected_output="Tabellarische Gegenueberstellung mit Beitrag, Leistungen.",
            agent=self.tarif_researcher(),
        )

    @task
    def profile(self) -> CrewTask:
        return CrewTask(
            description="Extrahiere Kundenprofil aus: {customer_info}",
            expected_output="Strukturierte Profildaten als Bullet-Liste.",
            agent=self.kunden_profiler(),
        )

    @task
    def write(self) -> CrewTask:
        # DSGVO + §34d: no_pii blockt PII-Leaks, StringGuardrail blockt
        # Tarif-Empfehlungen. BEIDE Guardrails sind spec-mandated (§4.5 AC 5).
        neutral_rule = StringGuardrail(
            "Output darf keine Tarif-Empfehlung enthalten, nur neutralen Vergleich. "
            "§34d-konform: Information, nicht Beratung.",
            llm_client=self._ollama_client,
            model="ollama/qwen3:8b",
        )
        return CrewTask(
            description="Erstelle einen §34d-neutralen Vergleich fuer den Kunden.",
            expected_output="Markdown-Text, 500-800 Woerter, neutral, keine Empfehlung.",
            agent=self.empfehlungs_writer(),
            context=[self.research(), self.profile()],
            guardrail=chain(no_pii(), neutral_rule),
            max_retries=2,
        )

    @crew
    def assemble(self) -> Crew:
        return Crew(
            agents=[self.tarif_researcher(), self.kunden_profiler(), self.empfehlungs_writer()],
            tasks=[self.research(), self.profile(), self.write()],
            process=CrewProcess.SEQUENTIAL,
            verbose=True,
        )
