"""Schemas — Adaptive live interview follow-ups."""

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 InterviewMode(str, Enum):
    CHAT = "chat"
    VOICE = "voice"
    VIDEO = "video"


class TranscriptTurn(BaseModel):
    turn_id: str
    role: str = Field(..., description="interviewer | candidate")
    text: str
    timestamp_ms: int | None = None


class FollowUpRequest(BaseModel):
    """POST /api/v1/interviews/follow-up"""

    correlation_id: UUID | None = None
    interview_id: str = Field(..., min_length=1)
    mode: InterviewMode = InterviewMode.CHAT
    persona: Persona = Persona.TECHNICAL
    role_title: str
    job_description: str | None = None
    planned_question: str | None = Field(
        default=None,
        description="Current planned question being asked",
    )
    candidate_answer: str = Field(..., min_length=1)
    transcript: list[TranscriptTurn] = Field(default_factory=list)
    skills_focus: list[str] = Field(default_factory=list)
    max_follow_ups: int = Field(default=1, ge=1, le=5)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class FollowUpQuestion(BaseModel):
    id: str
    text: str
    rationale: str | None = None
    skill_tags: list[str] = Field(default_factory=list)


class FollowUpResponse(StubMeta):
    correlation_id: UUID | None = None
    interview_id: str
    should_follow_up: bool = False
    follow_ups: list[FollowUpQuestion] = Field(default_factory=list)
    next_action: str = "continue"  # continue | wrap_up | skip


class EvaluateAnswerRequest(BaseModel):
    """POST /api/v1/interviews/evaluate-answer — real-time turn evaluation."""

    correlation_id: UUID | None = None
    interview_id: str = Field(..., min_length=1)
    mode: InterviewMode = InterviewMode.CHAT
    persona: Persona = Persona.TECHNICAL
    role_title: str
    job_description: str | None = None
    question: str = Field(..., min_length=1)
    candidate_answer: str = Field(..., min_length=1)
    skills_focus: 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 EvaluateAnswerResponse(StubMeta):
    correlation_id: UUID | None = None
    interview_id: str
    score: float | None = None
    max_score: float = 1.0
    feedback: str | None = None
    strengths: list[str] = Field(default_factory=list)
    gaps: list[str] = Field(default_factory=list)
    next_action: str = "continue"
