"""Schemas — Question generation (generic + role/JD-aware)."""

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

from pydantic import BaseModel, Field

from app.prompts import Persona
from app.schemas.common import StubMeta


class QuestionType(str, Enum):
    MCQ = "mcq"
    SHORT_ANSWER = "short_answer"
    LONG_ANSWER = "long_answer"
    TRUE_FALSE = "true_false"
    CODING = "coding"


class Difficulty(str, Enum):
    EASY = "easy"
    MEDIUM = "medium"
    HARD = "hard"


class QuestionGenRequest(BaseModel):
    """POST /api/v1/questions/generate"""

    correlation_id: UUID | None = Field(default=None,description="Caller correlation id for tracing across Platform services",
    )
    subject: str = Field(..., min_length=1, examples=["Mathematics"])
    topic: str = Field(..., min_length=1, examples=["Algebra"])
    question_type: QuestionType = QuestionType.MCQ
    difficulty: Difficulty = Difficulty.MEDIUM
    count: int = Field(default=5, ge=1, le=50)
    language: str = Field(default="en", min_length=2, max_length=10)
    context: str | None = Field(default=None,description="Optional source text / syllabus excerpt to ground generation",
    )
    constraints: dict[str, Any] = Field(default_factory=dict,description="Platform-specific knobs (bloom_level, include_explanation, etc.)",
    )


class GeneratedOption(BaseModel):
    key: str
    text: str
    is_correct: bool = False


class GeneratedQuestion(BaseModel):
    id: str
    question_type: QuestionType
    difficulty: Difficulty
    stem: str
    options: list[GeneratedOption] = Field(default_factory=list)
    answer: str | None = None
    explanation: str | None = None
    metadata: dict[str, Any] = Field(default_factory=dict)


class QuestionGenResponse(StubMeta):
    correlation_id: UUID | None = None
    questions: list[GeneratedQuestion] = Field(default_factory=list)


class RoleQuestionGenRequest(BaseModel):
    """POST /api/v1/questions/from-role"""

    correlation_id: UUID | None = None
    role_title: str = Field(..., min_length=1, examples=["Senior Backend Engineer"])
    job_description: str = Field(
        ...,
        min_length=20,
        description="Full or partial JD used to ground question generation",
    )
    persona: Persona = Persona.TECHNICAL
    seniority: str | None = Field(default=None, examples=["senior"])
    department: str | None = Field(default=None, examples=["Engineering"])
    skills: list[str] = Field(
        default_factory=list,
        description="Optional skill focus list; derived from JD when empty",
    )
    question_types: list[QuestionType] = Field(
        default_factory=lambda: [QuestionType.SHORT_ANSWER],
    )
    difficulty: Difficulty = Difficulty.MEDIUM
    count: int = Field(default=8, ge=1, le=50)
    language: str = Field(default="en", min_length=2, max_length=10)
    instructions: str | None = Field(
        default=None,
        description="Extra interviewer guidance (e.g. include system-design deep dive)",
    )
    options: dict[str, Any] = Field(default_factory=dict)


class RoleQuestionGenResponse(StubMeta):
    correlation_id: UUID | None = None
    role_title: str
    persona: Persona
    prompt_preview: dict[str, str] = Field(
        default_factory=dict,
        description="Rendered persona prompt templates used for this request",
    )
    questions: list[GeneratedQuestion] = Field(default_factory=list)
