"""
Communication Types - Enums, data classes, templates, and legal references.
"""
import logging
import os
from typing import Optional, List, Dict, Any
from enum import Enum
from dataclasses import dataclass

import httpx

logger = logging.getLogger(__name__)

LEGAL_CRAWLER_API_URL = os.getenv(
    "LEGAL_CRAWLER_API_URL",
    "http://localhost:8000/v1/legal-crawler"
)


class CommunicationType(str, Enum):
    """Arten von Eltern-Kommunikation."""
    GENERAL_INFO = "general_info"
    BEHAVIOR = "behavior"
    ACADEMIC = "academic"
    ATTENDANCE = "attendance"
    MEETING_INVITE = "meeting_invite"
    POSITIVE_FEEDBACK = "positive_feedback"
    CONCERN = "concern"
    CONFLICT = "conflict"
    SPECIAL_NEEDS = "special_needs"


class CommunicationTone(str, Enum):
    """Tonalitaet der Kommunikation."""
    FORMAL = "formal"
    PROFESSIONAL = "professional"
    WARM = "warm"
    CONCERNED = "concerned"
    APPRECIATIVE = "appreciative"


@dataclass
class LegalReference:
    """Rechtliche Referenz fuer Kommunikation."""
    law: str
    paragraph: str
    title: str
    summary: str
    relevance: str


@dataclass
class GFKPrinciple:
    """Prinzip der Gewaltfreien Kommunikation."""
    principle: str
    description: str
    example: str


# Fallback Rechtliche Grundlagen (nur verwendet wenn DB leer)
FALLBACK_LEGAL_REFERENCES: Dict[str, Dict[str, LegalReference]] = {
    "DEFAULT": {
        "elternpflichten": LegalReference(
            law="Landesschulgesetz",
            paragraph="(je nach Bundesland)",
            title="Pflichten der Eltern",
            summary="Eltern haben die Pflicht, die schulische Entwicklung zu unterstuetzen.",
            relevance="Grundlage fuer Kooperationsaufforderungen"
        ),
        "schulpflicht": LegalReference(
            law="Landesschulgesetz",
            paragraph="(je nach Bundesland)",
            title="Schulpflicht",
            summary="Kinder sind schulpflichtig. Eltern sind verantwortlich fuer regelmaessigen Schulbesuch.",
            relevance="Bei Fehlzeiten und Anwesenheitsproblemen"
        ),
    }
}

GFK_PRINCIPLES = [
    GFKPrinciple(
        principle="Beobachtung",
        description="Konkrete Handlungen beschreiben ohne Bewertung oder Interpretation",
        example="'Ich habe bemerkt, dass Max in den letzten zwei Wochen dreimal ohne Hausaufgaben kam.' statt 'Max ist faul.'"
    ),
    GFKPrinciple(
        principle="Gefuehle",
        description="Eigene Gefuehle ausdruecken (Ich-Botschaften)",
        example="'Ich mache mir Sorgen...' statt 'Sie muessen endlich...'"
    ),
    GFKPrinciple(
        principle="Beduerfnisse",
        description="Dahinterliegende Beduerfnisse benennen",
        example="'Mir ist wichtig, dass Max sein Potential entfalten kann.' statt 'Sie muessen mehr kontrollieren.'"
    ),
    GFKPrinciple(
        principle="Bitten",
        description="Konkrete, erfuellbare Bitten formulieren",
        example="'Waeren Sie bereit, taeglich die Hausaufgaben zu pruefen?' statt 'Tun Sie endlich etwas!'"
    ),
]

COMMUNICATION_TEMPLATES: Dict[CommunicationType, Dict[str, str]] = {
    CommunicationType.GENERAL_INFO: {
        "subject": "Information: {topic}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich moechte Sie ueber folgendes informieren:",
        "closing": "Bei Fragen stehe ich Ihnen gerne zur Verfuegung.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.BEHAVIOR: {
        "subject": "Gespraechswunsch: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich wende mich heute an Sie, da mir das Wohlergehen von {student_name} sehr am Herzen liegt.",
        "closing": "Ich bin ueberzeugt, dass wir gemeinsam eine gute Loesung finden koennen. Ich wuerde mich ueber ein Gespraech freuen.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.ACADEMIC: {
        "subject": "Schulische Entwicklung: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich moechte Sie ueber die schulische Entwicklung von {student_name} informieren.",
        "closing": "Ich wuerde mich freuen, wenn wir gemeinsam ueberlegen koennten, wie wir {student_name} optimal unterstuetzen koennen.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.ATTENDANCE: {
        "subject": "Fehlzeiten: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich wende mich an Sie bezueglich der Anwesenheit von {student_name}.",
        "closing": "Gemaess {legal_reference} sind regelmaessige Fehlzeiten meldepflichtig. Ich bin sicher, dass wir gemeinsam eine Loesung finden.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.MEETING_INVITE: {
        "subject": "Einladung zum Elterngespraech",
        "opening": "Sehr geehrte/r {parent_name},\n\nich wuerde mich freuen, Sie zu einem persoenlichen Gespraech einzuladen.",
        "closing": "Bitte teilen Sie mir mit, ob einer der vorgeschlagenen Termine fuer Sie passt, oder nennen Sie mir einen Alternativtermin.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.POSITIVE_FEEDBACK: {
        "subject": "Positive Rueckmeldung: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich freue mich, Ihnen heute eine erfreuliche Nachricht mitteilen zu koennen.",
        "closing": "Ich freue mich, {student_name} auf diesem positiven Weg weiter begleiten zu duerfen.\n\nMit herzlichen Gruessen",
    },
    CommunicationType.CONCERN: {
        "subject": "Gemeinsame Sorge: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich wende mich heute an Sie, weil mir etwas aufgefallen ist, das ich gerne mit Ihnen besprechen wuerde.",
        "closing": "Ich bin ueberzeugt, dass wir im Sinne von {student_name} gemeinsam eine gute Loesung finden werden.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.CONFLICT: {
        "subject": "Bitte um ein klaerendes Gespraech",
        "opening": "Sehr geehrte/r {parent_name},\n\nich moechte das Gespraech mit Ihnen suchen, da mir eine konstruktive Zusammenarbeit sehr wichtig ist.",
        "closing": "Mir liegt eine gute Kooperation zum Wohl von {student_name} am Herzen. Ich bin ueberzeugt, dass wir im Dialog eine fuer alle Seiten gute Loesung finden koennen.\n\nMit freundlichen Gruessen",
    },
    CommunicationType.SPECIAL_NEEDS: {
        "subject": "Foerderung: {student_name}",
        "opening": "Sehr geehrte/r {parent_name},\n\nich moechte mit Ihnen ueber die individuelle Foerderung von {student_name} sprechen.",
        "closing": "Gemaess dem Bildungsauftrag ({legal_reference}) ist es uns ein besonderes Anliegen, jedes Kind optimal zu foerdern. Lassen Sie uns gemeinsam ueberlegen, wie wir {student_name} bestmoeglich unterstuetzen koennen.\n\nMit freundlichen Gruessen",
    },
}


async def fetch_legal_references_from_db(state: str) -> List[Dict[str, Any]]:
    """Laedt rechtliche Referenzen aus der Datenbank (via Legal Crawler API)."""
    try:
        async with httpx.AsyncClient(timeout=10.0) as client:
            response = await client.get(f"{LEGAL_CRAWLER_API_URL}/references/{state}")
            if response.status_code == 200:
                return response.json().get("documents", [])
            else:
                logger.warning(f"Legal API returned {response.status_code} for state {state}")
                return []
    except Exception as e:
        logger.error(f"Fehler beim Laden rechtlicher Referenzen fuer {state}: {e}")
        return []


def parse_db_references_to_legal_refs(
    db_docs: List[Dict[str, Any]], topic: str
) -> List[LegalReference]:
    """Konvertiert DB-Dokumente in LegalReference-Objekte."""
    references = []
    topic_keywords = {
        "elternpflichten": ["42", "76", "85", "eltern", "pflicht"],
        "schulpflicht": ["41", "35", "schulpflicht", "pflicht"],
        "ordnungsmassnahmen": ["53", "ordnung", "erzieh", "massnahm"],
        "datenschutz": ["120", "daten", "schutz"],
        "foerderung": ["2", "foerder", "bildung", "auftrag"],
    }
    keywords = topic_keywords.get(topic, ["eltern"])

    for doc in db_docs:
        law_name = doc.get("law_name", doc.get("title", "Schulgesetz"))
        paragraphs = doc.get("paragraphs", [])

        if not paragraphs:
            references.append(LegalReference(
                law=law_name, paragraph="(siehe Gesetzestext)",
                title=doc.get("title", "Schulgesetz"),
                summary=f"Rechtliche Grundlage aus {law_name}",
                relevance=f"Relevant fuer {topic}"
            ))
            continue

        for para in paragraphs[:10]:
            para_nr = para.get("nr", "")
            para_title = para.get("title", "")
            is_relevant = any(
                kw.lower() in para_nr.lower() or kw.lower() in para_title.lower()
                for kw in keywords
            )
            if is_relevant:
                references.append(LegalReference(
                    law=law_name, paragraph=para_nr,
                    title=para_title[:100],
                    summary=f"{para_title[:150]}",
                    relevance=f"Relevant fuer {topic}"
                ))

    return references
