"""
Erwartungshorizont Templates for Vorabitur Mode

Provides pre-defined templates based on German Abitur text analysis types:
- Textanalyse (pragmatische Texte)
- Sachtextanalyse
- Gedichtanalyse / Lyrikinterpretation
- Dramenanalyse
- Epische Textanalyse / Prosaanalyse
- Eroerterung (textgebunden / frei)
- Literarische Eroerterung
- Materialgestuetztes Schreiben

Each template includes:
- Structured criteria with weights
- Typical expectations per section
- NiBiS-aligned evaluation points
"""

from typing import Dict, List, Optional
from dataclasses import dataclass, field, asdict
from datetime import datetime
import uuid


# =============================================
# TEMPLATE TYPES
# =============================================

AUFGABENTYPEN = {
    "textanalyse_pragmatisch": {
        "name": "Textanalyse (pragmatische Texte)",
        "description": "Analyse von Sachtexten, Reden, Kommentaren, Essays",
        "category": "analyse"
    },
    "sachtextanalyse": {
        "name": "Sachtextanalyse",
        "description": "Analyse von informativen und appellativen Sachtexten",
        "category": "analyse"
    },
    "gedichtanalyse": {
        "name": "Gedichtanalyse / Lyrikinterpretation",
        "description": "Analyse und Interpretation lyrischer Texte",
        "category": "interpretation"
    },
    "dramenanalyse": {
        "name": "Dramenanalyse",
        "description": "Analyse dramatischer Texte und Szenen",
        "category": "interpretation"
    },
    "prosaanalyse": {
        "name": "Epische Textanalyse / Prosaanalyse",
        "description": "Analyse von Romanauszuegen, Kurzgeschichten, Novellen",
        "category": "interpretation"
    },
    "eroerterung_textgebunden": {
        "name": "Textgebundene Eroerterung",
        "description": "Eroerterung auf Basis eines Sachtextes",
        "category": "argumentation"
    },
    "eroerterung_frei": {
        "name": "Freie Eroerterung",
        "description": "Freie Eroerterung zu einem Thema",
        "category": "argumentation"
    },
    "eroerterung_literarisch": {
        "name": "Literarische Eroerterung",
        "description": "Eroerterung zu literarischen Fragestellungen",
        "category": "argumentation"
    },
    "materialgestuetzt": {
        "name": "Materialgestuetztes Schreiben",
        "description": "Verfassen eines Textes auf Materialbasis",
        "category": "produktion"
    }
}


# =============================================
# TEMPLATE STRUCTURES
# =============================================

@dataclass
class EHKriterium:
    """Single criterion in an Erwartungshorizont."""
    id: str
    name: str
    beschreibung: str
    gewichtung: int  # Percentage weight (0-100)
    erwartungen: List[str]  # Expected points/elements
    max_punkte: int = 100

    def to_dict(self):
        return asdict(self)


@dataclass
class EHTemplate:
    """Complete Erwartungshorizont template."""
    id: str
    aufgabentyp: str
    name: str
    beschreibung: str
    kriterien: List[EHKriterium]
    einleitung_hinweise: List[str]
    hauptteil_hinweise: List[str]
    schluss_hinweise: List[str]
    sprachliche_aspekte: List[str]
    created_at: datetime = field(default_factory=lambda: datetime.now())

    def to_dict(self):
        d = {
            'id': self.id,
            'aufgabentyp': self.aufgabentyp,
            'name': self.name,
            'beschreibung': self.beschreibung,
            'kriterien': [k.to_dict() for k in self.kriterien],
            'einleitung_hinweise': self.einleitung_hinweise,
            'hauptteil_hinweise': self.hauptteil_hinweise,
            'schluss_hinweise': self.schluss_hinweise,
            'sprachliche_aspekte': self.sprachliche_aspekte,
            'created_at': self.created_at.isoformat()
        }
        return d


# =============================================
# PRE-DEFINED TEMPLATES
# =============================================

def get_textanalyse_template() -> EHTemplate:
    """Template for pragmatic text analysis."""
    return EHTemplate(
        id="template_textanalyse_pragmatisch",
        aufgabentyp="textanalyse_pragmatisch",
        name="Textanalyse pragmatischer Texte",
        beschreibung="Vorlage fuer die Analyse von Sachtexten, Reden, Kommentaren und Essays",
        kriterien=[
            EHKriterium(
                id="inhalt",
                name="Inhaltliche Leistung",
                beschreibung="Erfassung und Wiedergabe des Textinhalts",
                gewichtung=40,
                erwartungen=[
                    "Korrekte Erfassung der Textaussage/These",
                    "Vollstaendige Wiedergabe der Argumentationsstruktur",
                    "Erkennen von Intention und Adressatenbezug",
                    "Einordnung in den historischen/gesellschaftlichen Kontext",
                    "Beruecksichtigung aller relevanten Textaspekte"
                ]
            ),
            EHKriterium(
                id="struktur",
                name="Aufbau und Struktur",
                beschreibung="Logischer Aufbau und Gliederung der Analyse",
                gewichtung=15,
                erwartungen=[
                    "Sinnvolle Einleitung mit Basisinformationen",
                    "Logische Gliederung des Hauptteils",
                    "Stringente Gedankenfuehrung",
                    "Angemessener Schluss mit Fazit/Wertung",
                    "Absatzgliederung und Ueberlaenge"
                ]
            ),
            EHKriterium(
                id="analyse",
                name="Analytische Qualitaet",
                beschreibung="Tiefe und Qualitaet der Analyse",
                gewichtung=15,
                erwartungen=[
                    "Erkennen rhetorischer Mittel",
                    "Funktionale Deutung der Stilmittel",
                    "Analyse der Argumentationsweise",
                    "Beruecksichtigung von Wortwahl und Satzbau",
                    "Verknuepfung von Form und Inhalt"
                ]
            ),
            EHKriterium(
                id="rechtschreibung",
                name="Sprachliche Richtigkeit (Rechtschreibung)",
                beschreibung="Orthografische Korrektheit",
                gewichtung=15,
                erwartungen=[
                    "Korrekte Rechtschreibung",
                    "Korrekte Gross- und Kleinschreibung",
                    "Korrekte Getrennt- und Zusammenschreibung",
                    "Korrekte Fremdwortschreibung"
                ]
            ),
            EHKriterium(
                id="grammatik",
                name="Sprachliche Richtigkeit (Grammatik)",
                beschreibung="Grammatische Korrektheit und Zeichensetzung",
                gewichtung=15,
                erwartungen=[
                    "Korrekter Satzbau",
                    "Korrekte Flexion",
                    "Korrekte Zeichensetzung",
                    "Korrekte Bezuege und Kongruenz"
                ]
            )
        ],
        einleitung_hinweise=[
            "Nennung von Autor, Titel, Textsorte, Erscheinungsjahr",
            "Benennung des Themas",
            "Formulierung der Kernthese/Hauptaussage",
            "Ggf. Einordnung in den Kontext"
        ],
        hauptteil_hinweise=[
            "Systematische Analyse der Argumentationsstruktur",
            "Untersuchung der sprachlichen Gestaltung",
            "Funktionale Deutung der Stilmittel",
            "Beruecksichtigung von Adressatenbezug und Intention",
            "Textbelege durch Zitate"
        ],
        schluss_hinweise=[
            "Zusammenfassung der Analyseergebnisse",
            "Bewertung der Ueberzeugungskraft",
            "Ggf. aktuelle Relevanz",
            "Persoenliche Stellungnahme (wenn gefordert)"
        ],
        sprachliche_aspekte=[
            "Fachsprachliche Begriffe korrekt verwenden",
            "Konjunktiv fuer indirekte Rede",
            "Praesens als Tempus der Analyse",
            "Sachlicher, analytischer Stil"
        ]
    )


def get_gedichtanalyse_template() -> EHTemplate:
    """Template for poetry analysis."""
    return EHTemplate(
        id="template_gedichtanalyse",
        aufgabentyp="gedichtanalyse",
        name="Gedichtanalyse / Lyrikinterpretation",
        beschreibung="Vorlage fuer die Analyse und Interpretation lyrischer Texte",
        kriterien=[
            EHKriterium(
                id="inhalt",
                name="Inhaltliche Leistung",
                beschreibung="Erfassung und Deutung des Gedichtinhalts",
                gewichtung=40,
                erwartungen=[
                    "Korrekte Erfassung des lyrischen Ichs und der Sprechsituation",
                    "Vollstaendige inhaltliche Erschliessung aller Strophen",
                    "Erkennen der zentralen Motive und Themen",
                    "Epochenzuordnung und literaturgeschichtliche Einordnung",
                    "Deutung der Bildlichkeit und Symbolik"
                ]
            ),
            EHKriterium(
                id="struktur",
                name="Aufbau und Struktur",
                beschreibung="Logischer Aufbau der Interpretation",
                gewichtung=15,
                erwartungen=[
                    "Einleitung mit Basisinformationen",
                    "Systematische strophenweise oder aspektorientierte Analyse",
                    "Verknuepfung von Form- und Inhaltsanalyse",
                    "Schluessige Gesamtdeutung im Schluss"
                ]
            ),
            EHKriterium(
                id="formanalyse",
                name="Formale Analyse",
                beschreibung="Analyse der lyrischen Gestaltungsmittel",
                gewichtung=15,
                erwartungen=[
                    "Bestimmung von Metrum und Reimschema",
                    "Analyse der Klanggestaltung",
                    "Erkennen von Enjambements und Zaesuren",
                    "Deutung der formalen Mittel",
                    "Verknuepfung von Form und Inhalt"
                ]
            ),
            EHKriterium(
                id="rechtschreibung",
                name="Sprachliche Richtigkeit (Rechtschreibung)",
                beschreibung="Orthografische Korrektheit",
                gewichtung=15,
                erwartungen=[
                    "Korrekte Rechtschreibung",
                    "Korrekte Gross- und Kleinschreibung",
                    "Korrekte Getrennt- und Zusammenschreibung"
                ]
            ),
            EHKriterium(
                id="grammatik",
                name="Sprachliche Richtigkeit (Grammatik)",
                beschreibung="Grammatische Korrektheit und Zeichensetzung",
                gewichtung=15,
                erwartungen=[
                    "Korrekter Satzbau",
                    "Korrekte Flexion",
                    "Korrekte Zeichensetzung"
                ]
            )
        ],
        einleitung_hinweise=[
            "Autor, Titel, Entstehungsjahr/Epoche",
            "Thema/Motiv des Gedichts",
            "Erste Deutungshypothese",
            "Formale Grunddaten (Strophen, Verse)"
        ],
        hauptteil_hinweise=[
            "Inhaltliche Analyse (strophenweise oder aspektorientiert)",
            "Formale Analyse (Metrum, Reim, Klang)",
            "Sprachliche Analyse (Stilmittel, Bildlichkeit)",
            "Funktionale Verknuepfung aller Ebenen",
            "Textbelege durch Zitate mit Versangabe"
        ],
        schluss_hinweise=[
            "Zusammenfassung der Interpretationsergebnisse",
            "Bestaetigung/Modifikation der Deutungshypothese",
            "Einordnung in Epoche/Werk des Autors",
            "Aktualitaetsbezug (wenn sinnvoll)"
        ],
        sprachliche_aspekte=[
            "Fachbegriffe der Lyrikanalyse verwenden",
            "Zwischen lyrischem Ich und Autor unterscheiden",
            "Praesens als Analysetempus",
            "Deutende statt beschreibende Formulierungen"
        ]
    )


def get_eroerterung_template() -> EHTemplate:
    """Template for textgebundene Eroerterung."""
    return EHTemplate(
        id="template_eroerterung_textgebunden",
        aufgabentyp="eroerterung_textgebunden",
        name="Textgebundene Eroerterung",
        beschreibung="Vorlage fuer die textgebundene Eroerterung auf Basis eines Sachtextes",
        kriterien=[
            EHKriterium(
                id="inhalt",
                name="Inhaltliche Leistung",
                beschreibung="Qualitaet der Argumentation",
                gewichtung=40,
                erwartungen=[
                    "Korrekte Wiedergabe der Textposition",
                    "Differenzierte eigene Argumentation",
                    "Vielfaeltige und ueberzeugende Argumente",
                    "Beruecksichtigung von Pro und Contra",
                    "Sinnvolle Beispiele und Belege",
                    "Eigenstaendige Schlussfolgerung"
                ]
            ),
            EHKriterium(
                id="struktur",
                name="Aufbau und Struktur",
                beschreibung="Logischer Aufbau der Eroerterung",
                gewichtung=15,
                erwartungen=[
                    "Problemorientierte Einleitung",
                    "Klare Gliederung der Argumentation",
                    "Logische Argumentationsfolge",
                    "Sinnvolle Ueberlaetze",
                    "Begruendetes Fazit"
                ]
            ),
            EHKriterium(
                id="textbezug",
                name="Textbezug",
                beschreibung="Verknuepfung mit dem Ausgangstext",
                gewichtung=15,
                erwartungen=[
                    "Angemessene Textwiedergabe",
                    "Kritische Auseinandersetzung mit Textposition",
                    "Korrekte Zitierweise",
                    "Verknuepfung eigener Argumente mit Text"
                ]
            ),
            EHKriterium(
                id="rechtschreibung",
                name="Sprachliche Richtigkeit (Rechtschreibung)",
                beschreibung="Orthografische Korrektheit",
                gewichtung=15,
                erwartungen=[
                    "Korrekte Rechtschreibung",
                    "Korrekte Gross- und Kleinschreibung"
                ]
            ),
            EHKriterium(
                id="grammatik",
                name="Sprachliche Richtigkeit (Grammatik)",
                beschreibung="Grammatische Korrektheit und Zeichensetzung",
                gewichtung=15,
                erwartungen=[
                    "Korrekter Satzbau",
                    "Korrekte Zeichensetzung",
                    "Variationsreicher Ausdruck"
                ]
            )
        ],
        einleitung_hinweise=[
            "Hinfuehrung zum Thema",
            "Nennung des Ausgangstextes",
            "Formulierung der Leitfrage/These",
            "Ueberleitung zum Hauptteil"
        ],
        hauptteil_hinweise=[
            "Kurze Wiedergabe der Textposition",
            "Systematische Argumentation (dialektisch oder linear)",
            "Jedes Argument: These - Begruendung - Beispiel",
            "Gewichtung der Argumente",
            "Verknuepfung mit Textposition"
        ],
        schluss_hinweise=[
            "Zusammenfassung der wichtigsten Argumente",
            "Eigene begruendete Stellungnahme",
            "Ggf. Ausblick oder Appell"
        ],
        sprachliche_aspekte=[
            "Argumentative Konnektoren verwenden",
            "Sachlicher, ueberzeugender Stil",
            "Eigene Meinung kennzeichnen",
            "Konjunktiv fuer Textpositionen"
        ]
    )


def get_prosaanalyse_template() -> EHTemplate:
    """Template for prose/narrative text analysis."""
    return EHTemplate(
        id="template_prosaanalyse",
        aufgabentyp="prosaanalyse",
        name="Epische Textanalyse / Prosaanalyse",
        beschreibung="Vorlage fuer die Analyse von Romanauszuegen, Kurzgeschichten und Novellen",
        kriterien=[
            EHKriterium(
                id="inhalt",
                name="Inhaltliche Leistung",
                beschreibung="Erfassung und Deutung des Textinhalts",
                gewichtung=40,
                erwartungen=[
                    "Korrekte Erfassung der Handlung",
                    "Charakterisierung der Figuren",
                    "Erkennen der Erzaehlsituation",
                    "Deutung der Konflikte und Motive",
                    "Einordnung in den Gesamtzusammenhang"
                ]
            ),
            EHKriterium(
                id="struktur",
                name="Aufbau und Struktur",
                beschreibung="Logischer Aufbau der Analyse",
                gewichtung=15,
                erwartungen=[
                    "Informative Einleitung",
                    "Systematische Analyse im Hauptteil",
                    "Verknuepfung der Analyseergebnisse",
                    "Schluessige Gesamtdeutung"
                ]
            ),
            EHKriterium(
                id="erzaehltechnik",
                name="Erzaehltechnische Analyse",
                beschreibung="Analyse narrativer Gestaltungsmittel",
                gewichtung=15,
                erwartungen=[
                    "Bestimmung der Erzaehlperspektive",
                    "Analyse von Zeitgestaltung",
                    "Raumgestaltung und Atmosphaere",
                    "Figurenrede und Bewusstseinsdarstellung",
                    "Funktionale Deutung"
                ]
            ),
            EHKriterium(
                id="rechtschreibung",
                name="Sprachliche Richtigkeit (Rechtschreibung)",
                beschreibung="Orthografische Korrektheit",
                gewichtung=15,
                erwartungen=[
                    "Korrekte Rechtschreibung",
                    "Korrekte Gross- und Kleinschreibung"
                ]
            ),
            EHKriterium(
                id="grammatik",
                name="Sprachliche Richtigkeit (Grammatik)",
                beschreibung="Grammatische Korrektheit und Zeichensetzung",
                gewichtung=15,
                erwartungen=[
                    "Korrekter Satzbau",
                    "Korrekte Zeichensetzung"
                ]
            )
        ],
        einleitung_hinweise=[
            "Autor, Titel, Textsorte, Erscheinungsjahr",
            "Einordnung des Auszugs in den Gesamttext",
            "Thema und Deutungshypothese"
        ],
        hauptteil_hinweise=[
            "Kurze Inhaltsangabe des Auszugs",
            "Analyse der Handlungsstruktur",
            "Figurenanalyse mit Textbelegen",
            "Erzaehltechnische Analyse",
            "Sprachliche Analyse",
            "Verknuepfung aller Ebenen"
        ],
        schluss_hinweise=[
            "Zusammenfassung der Analyseergebnisse",
            "Bestaetigung der Deutungshypothese",
            "Bedeutung fuer Gesamtwerk",
            "Ggf. Aktualitaetsbezug"
        ],
        sprachliche_aspekte=[
            "Fachbegriffe der Erzaehltextanalyse",
            "Zwischen Erzaehler und Autor unterscheiden",
            "Praesens als Analysetempus",
            "Deutende Formulierungen"
        ]
    )


def get_dramenanalyse_template() -> EHTemplate:
    """Template for drama analysis."""
    return EHTemplate(
        id="template_dramenanalyse",
        aufgabentyp="dramenanalyse",
        name="Dramenanalyse",
        beschreibung="Vorlage fuer die Analyse dramatischer Texte und Szenen",
        kriterien=[
            EHKriterium(
                id="inhalt",
                name="Inhaltliche Leistung",
                beschreibung="Erfassung und Deutung des Szeneninhalts",
                gewichtung=40,
                erwartungen=[
                    "Korrekte Erfassung der Handlung",
                    "Analyse der Figurenkonstellation",
                    "Erkennen des dramatischen Konflikts",
                    "Einordnung in den Handlungsverlauf",
                    "Deutung der Szene im Gesamtzusammenhang"
                ]
            ),
            EHKriterium(
                id="struktur",
                name="Aufbau und Struktur",
                beschreibung="Logischer Aufbau der Analyse",
                gewichtung=15,
                erwartungen=[
                    "Einleitung mit Kontextualisierung",
                    "Systematische Szenenanalyse",
                    "Verknuepfung der Analyseergebnisse",
                    "Schluessige Deutung"
                ]
            ),
            EHKriterium(
                id="dramentechnik",
                name="Dramentechnische Analyse",
                beschreibung="Analyse dramatischer Gestaltungsmittel",
                gewichtung=15,
                erwartungen=[
                    "Analyse der Dialoggestaltung",
                    "Regieanweisungen und Buehnenraum",
                    "Dramatische Spannung",
                    "Monolog/Dialog-Formen",
                    "Funktionale Deutung"
                ]
            ),
            EHKriterium(
                id="rechtschreibung",
                name="Sprachliche Richtigkeit (Rechtschreibung)",
                beschreibung="Orthografische Korrektheit",
                gewichtung=15,
                erwartungen=[
                    "Korrekte Rechtschreibung"
                ]
            ),
            EHKriterium(
                id="grammatik",
                name="Sprachliche Richtigkeit (Grammatik)",
                beschreibung="Grammatische Korrektheit und Zeichensetzung",
                gewichtung=15,
                erwartungen=[
                    "Korrekter Satzbau",
                    "Korrekte Zeichensetzung"
                ]
            )
        ],
        einleitung_hinweise=[
            "Autor, Titel, Uraufführungsjahr, Dramenform",
            "Einordnung der Szene in den Handlungsverlauf",
            "Thema und Deutungshypothese"
        ],
        hauptteil_hinweise=[
            "Situierung der Szene",
            "Analyse des Dialogverlaufs",
            "Figurenanalyse im Dialog",
            "Sprachliche Analyse",
            "Dramentechnische Mittel",
            "Bedeutung fuer den Konflikt"
        ],
        schluss_hinweise=[
            "Zusammenfassung der Analyseergebnisse",
            "Funktion der Szene im Drama",
            "Bedeutung fuer die Gesamtdeutung"
        ],
        sprachliche_aspekte=[
            "Fachbegriffe der Dramenanalyse",
            "Praesens als Analysetempus",
            "Korrekte Zitierweise mit Akt/Szene/Zeile"
        ]
    )


# =============================================
# TEMPLATE REGISTRY
# =============================================

TEMPLATES: Dict[str, EHTemplate] = {}


def initialize_templates():
    """Initialize all pre-defined templates."""
    global TEMPLATES
    TEMPLATES = {
        "textanalyse_pragmatisch": get_textanalyse_template(),
        "gedichtanalyse": get_gedichtanalyse_template(),
        "eroerterung_textgebunden": get_eroerterung_template(),
        "prosaanalyse": get_prosaanalyse_template(),
        "dramenanalyse": get_dramenanalyse_template(),
    }


def get_template(aufgabentyp: str) -> Optional[EHTemplate]:
    """Get a template by Aufgabentyp."""
    if not TEMPLATES:
        initialize_templates()
    return TEMPLATES.get(aufgabentyp)


def list_templates() -> List[Dict]:
    """List all available templates."""
    if not TEMPLATES:
        initialize_templates()
    return [
        {
            "aufgabentyp": typ,
            "name": AUFGABENTYPEN.get(typ, {}).get("name", typ),
            "description": AUFGABENTYPEN.get(typ, {}).get("description", ""),
            "category": AUFGABENTYPEN.get(typ, {}).get("category", "other"),
        }
        for typ in TEMPLATES.keys()
    ]


def get_aufgabentypen() -> Dict:
    """Get all Aufgabentypen definitions."""
    return AUFGABENTYPEN


# Initialize on import
initialize_templates()
