"""Schemas — Answer / assessment evaluation."""

from enum import Enum
from typing import Any
from uuid import UUID

from pydantic import BaseModel, Field

from app.schemas.common import StubMeta


class EvaluationMode(str, Enum):
    AUTO = "auto"
    RUBRIC = "rubric"
    COMPARATIVE = "comparative"


class AnswerItem(BaseModel):
    question_id: str
    question_text: str
    expected_answer: str | None = None
    student_answer: str
    max_score: float = Field(default=1.0, ge=0)
    rubric: list[str] = Field(default_factory=list)


class AnswerEvaluationRequest(BaseModel):
    """POST /api/v1/answers/evaluate"""

    correlation_id: UUID | None = None
    assessment_id: str = Field(..., min_length=1)
    mode: EvaluationMode = EvaluationMode.AUTO
    answers: list[AnswerItem] = Field(..., min_length=1)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(
        default_factory=dict,
        description="Platform options (strictness, return_feedback, etc.)",
    )


class ScoreBreakdown(BaseModel):
    criterion: str
    score: float
    max_score: float
    comment: str | None = None


class EvaluatedAnswer(BaseModel):
    question_id: str
    score: float
    max_score: float
    is_correct: bool | None = None
    feedback: str | None = None
    breakdown: list[ScoreBreakdown] = Field(default_factory=list)
    metadata: dict[str, Any] = Field(default_factory=dict)


class AnswerEvaluationResponse(StubMeta):
    correlation_id: UUID | None = None
    assessment_id: str
    total_score: float = 0.0
    max_total_score: float = 0.0
    results: list[EvaluatedAnswer] = Field(default_factory=list)
