"""Schemas — AI assessment generation and grading."""

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

from pydantic import BaseModel, Field

from app.schemas.common import StubMeta
from app.schemas.questions import Difficulty, GeneratedQuestion, QuestionType


class AssessmentKind(str, Enum):
    CODING = "coding"
    MCQ = "mcq"
    CASE_STUDY = "case_study"
    APTITUDE = "aptitude"
    SCENARIO = "scenario"
    ESSAY = "essay"
    VIDEO_RESPONSE = "video_response"
    FILE_UPLOAD = "file_upload"
    PUZZLE = "puzzle"
    CUSTOM = "custom"


class AssessmentGenerateRequest(BaseModel):
    """POST /api/v1/assessments/generate"""

    correlation_id: UUID | None = None
    role_title: str
    job_description: str | None = None
    kind: AssessmentKind = AssessmentKind.MCQ
    difficulty: Difficulty = Difficulty.MEDIUM
    question_types: list[QuestionType] = Field(
        default_factory=lambda: [QuestionType.MCQ],
    )
    count: int = Field(default=10, ge=1, le=50)
    time_limit_minutes: int | None = Field(default=None, ge=1, le=480)
    skills: list[str] = Field(default_factory=list)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class AssessmentGenerateResponse(StubMeta):
    correlation_id: UUID | None = None
    assessment_id: str | None = None
    kind: AssessmentKind
    role_title: str
    questions: list[GeneratedQuestion] = Field(default_factory=list)
    rubric: dict[str, Any] = Field(default_factory=dict)


class AssessmentGradeRequest(BaseModel):
    """POST /api/v1/assessments/grade"""

    correlation_id: UUID | None = None
    assessment_id: str
    kind: AssessmentKind = AssessmentKind.MCQ
    answers: list[dict[str, Any]] = Field(..., min_length=1)
    rubric: dict[str, Any] = Field(default_factory=dict)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class AssessmentGradeResponse(StubMeta):
    correlation_id: UUID | None = None
    assessment_id: str
    total_score: float = 0.0
    max_total_score: float = 0.0
    passed: bool | None = None
    feedback_markdown: str | None = None
    item_results: list[dict[str, Any]] = Field(default_factory=list)
