"""Schemas — Interview preview & question regenerate (SOW)."""

from typing import Any
from uuid import UUID

from pydantic import BaseModel, Field

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


class InterviewPreviewRequest(BaseModel):
    """POST /api/v1/interview-preview/generate"""

    correlation_id: UUID | None = None
    role_title: str
    job_description: str = Field(..., min_length=20)
    persona: Persona = Persona.TECHNICAL
    count: int = Field(default=8, ge=1, le=40)
    question_types: list[QuestionType] = Field(
        default_factory=lambda: [QuestionType.SHORT_ANSWER],
    )
    difficulty: Difficulty = Difficulty.MEDIUM
    mandatory_topics: list[str] = Field(default_factory=list)
    custom_questions: 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 InterviewPreviewResponse(StubMeta):
    correlation_id: UUID | None = None
    preview_id: str | None = None
    role_title: str
    persona: Persona
    questions: list[GeneratedQuestion] = Field(default_factory=list)
    follow_up_logic: list[dict[str, Any]] = Field(default_factory=list)
    locked: bool = False


class RegenerateQuestionRequest(BaseModel):
    """POST /api/v1/interview-preview/regenerate-question"""

    correlation_id: UUID | None = None
    preview_id: str | None = None
    role_title: str
    job_description: str = Field(..., min_length=20)
    persona: Persona = Persona.TECHNICAL
    question_id: str | None = None
    previous_stem: str | None = None
    question_type: QuestionType = QuestionType.SHORT_ANSWER
    difficulty: Difficulty = Difficulty.MEDIUM
    instructions: str | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class RegenerateQuestionResponse(StubMeta):
    correlation_id: UUID | None = None
    question: GeneratedQuestion | None = None
