"""Schemas — Candidate interview scoring (confidence, hiring-fit, bias, skill-gap)."""

from typing import Any
from uuid import UUID

from pydantic import BaseModel, Field

from app.schemas.common import StubMeta
from app.schemas.interviews import InterviewMode, TranscriptTurn


class CandidateScoringRequest(BaseModel):
    """POST /api/v1/candidate-scoring"""

    correlation_id: UUID | None = None
    interview_id: str
    candidate_id: str
    role_title: str
    job_description: str | None = None
    mode: InterviewMode = InterviewMode.CHAT
    transcript: list[TranscriptTurn] = Field(default_factory=list)
    answers: list[dict[str, Any]] = Field(
        default_factory=list,
        description="Structured Q/A pairs if available",
    )
    required_skills: list[str] = Field(default_factory=list)
    options: dict[str, Any] = Field(default_factory=dict)


class SkillGapItem(BaseModel):
    skill: str
    required_level: float | None = None
    demonstrated_level: float | None = None
    gap: float | None = None
    evidence: str | None = None


class BiasFlag(BaseModel):
    category: str
    severity: str = "low"  # low | medium | high
    description: str
    recommendation: str | None = None


class CandidateScoringResponse(StubMeta):
    correlation_id: UUID | None = None
    interview_id: str
    candidate_id: str
    confidence_score: float | None = None
    hiring_fit_score: float | None = None
    hiring_fit_label: str | None = None  # strong_yes | yes | maybe | no
    skill_gaps: list[SkillGapItem] = Field(default_factory=list)
    bias_flags: list[BiasFlag] = Field(default_factory=list)
    behavioral_summary: str | None = None
    scorecard: dict[str, Any] = Field(default_factory=dict)
