"""Schemas — Timed puzzle challenges (SOW Assessment Types)."""

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


class PuzzleGenerateRequest(BaseModel):
    """POST /api/v1/puzzles/generate"""

    correlation_id: UUID | None = None
    puzzle_type: str = Field(
        default="logic",
        description="logic | pattern | riddle | spatial | numerical",
    )
    role_title: str | None = None
    difficulty: Difficulty = Difficulty.MEDIUM
    count: int = Field(default=5, ge=1, le=30)
    time_limit_minutes: int = Field(default=20, ge=5, le=120)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class PuzzleGenerateResponse(StubMeta):
    correlation_id: UUID | None = None
    puzzle_set_id: str | None = None
    puzzle_type: str
    time_limit_minutes: int
    puzzles: list[GeneratedQuestion] = Field(default_factory=list)


class PuzzleGradeRequest(BaseModel):
    """POST /api/v1/puzzles/grade"""

    correlation_id: UUID | None = None
    puzzle_set_id: str
    answers: list[dict[str, Any]] = Field(..., min_length=1)
    time_taken_seconds: int | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class PuzzleGradeResponse(StubMeta):
    correlation_id: UUID | None = None
    puzzle_set_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)
