"""CustomerSupportCrew — three-agent intake + classify + reply pipeline.

Generated by ``cognithor init --template customer-support``. Customize the
agents, tasks, and tools to fit your support workflow.
"""

from __future__ import annotations

from cognithor.crew import Crew, CrewAgent, CrewProcess, CrewTask
from cognithor.crew.decorators import agent, crew, task


class CustomerSupportCrew:
    """Sequential three-agent customer-support pipeline.

    - ``intake`` parses the raw customer message into a structured summary.
    - ``classifier`` categorizes the ticket (billing / technical / other);
      uses memory to learn from prior classifications.
    - ``response_writer`` drafts a friendly, on-brand reply.
    """

    @agent
    def intake(self) -> CrewAgent:
        return CrewAgent(
            role="Intake-Agent",
            goal="Parse die Kundennachricht in strukturierte Felder",
            backstory=(
                "Erfahrener Support-Mitarbeiter, der schnell die relevanten "
                "Fakten aus einer Kundennachricht extrahiert."
            ),
            llm="ollama/qwen3:8b",
        )

    @agent
    def classifier(self) -> CrewAgent:
        return CrewAgent(
            role="Klassifizierer",
            goal="Klassifiziere das Ticket nach Kategorie und Prioritaet",
            backstory=(
                "Analytiker mit Blick fuer Muster — nutzt Memory, um aus "
                "frueheren Tickets zu lernen."
            ),
            llm="ollama/qwen3:8b",
            memory=True,
        )

    @agent
    def response_writer(self) -> CrewAgent:
        return CrewAgent(
            role="Antwort-Verfasser",
            goal="Schreibe eine freundliche, loesungsorientierte Antwort",
            backstory=(
                "Kommunikations-Spezialist, der empathische Antworten "
                "auf Deutsch verfasst."
            ),
            llm="ollama/qwen3:8b",
        )

    @task
    def parse(self) -> CrewTask:
        return CrewTask(
            description="Parse die Kundennachricht: {message}",
            expected_output="Strukturierte Zusammenfassung als Bullet-Liste.",
            agent=self.intake(),
        )

    @task
    def classify(self) -> CrewTask:
        return CrewTask(
            description="Klassifiziere das Ticket nach Kategorie + Prioritaet.",
            expected_output="Kategorie (billing/technical/other) + Prioritaet (low/med/high).",
            agent=self.classifier(),
            context=[self.parse()],
        )

    @task
    def draft_reply(self) -> CrewTask:
        return CrewTask(
            description="Schreibe eine Antwort an den Kunden.",
            expected_output="Antwort-Text, 100-300 Woerter, freundlich, Loesungsorientiert.",
            agent=self.response_writer(),
            context=[self.classify()],
        )

    @crew
    def assemble(self) -> Crew:
        return Crew(
            agents=[self.intake(), self.classifier(), self.response_writer()],
            tasks=[self.parse(), self.classify(), self.draft_reply()],
            process=CrewProcess.SEQUENTIAL,
            verbose=False,
        )
