"""
Erwartungshorizont Templates — types and Aufgabentypen registry.
"""

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


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"
    }
}


@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
