"""
Klausur-Service Exam Models

Data classes for Klausur and StudentKlausur.
"""

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

from .enums import KlausurModus, StudentKlausurStatus


@dataclass
class StudentKlausur:
    """A student's exam work."""
    id: str
    klausur_id: str
    student_name: str
    student_id: Optional[str]
    file_path: Optional[str]
    ocr_text: Optional[str]
    status: StudentKlausurStatus
    criteria_scores: Dict[str, Dict]
    gutachten: Optional[Dict]
    raw_points: int
    grade_points: int
    created_at: datetime

    def to_dict(self) -> Dict[str, Any]:
        """Convert to dictionary for JSON serialization."""
        d = asdict(self)
        d['status'] = self.status.value if hasattr(self.status, 'value') else self.status
        d['created_at'] = self.created_at.isoformat()
        return d


@dataclass
class Klausur:
    """An exam/Klausur with associated student works."""
    id: str
    title: str
    subject: str
    modus: KlausurModus
    class_id: Optional[str]
    year: int
    semester: str
    erwartungshorizont: Optional[Dict]
    students: List[StudentKlausur]
    created_at: datetime
    teacher_id: str

    def to_dict(self) -> Dict[str, Any]:
        """Convert to dictionary for JSON serialization."""
        return {
            'id': self.id,
            'title': self.title,
            'subject': self.subject,
            'modus': self.modus.value,
            'class_id': self.class_id,
            'year': self.year,
            'semester': self.semester,
            'erwartungshorizont': self.erwartungshorizont,
            'student_count': len(self.students),
            'students': [s.to_dict() for s in self.students],
            'created_at': self.created_at.isoformat(),
            'teacher_id': self.teacher_id
        }
