"""Schemas — Final SOW AI coverage helpers."""

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 JdInclusivityRewriteRequest(BaseModel):
    """POST /api/v1/job-descriptions/inclusivity-rewrite"""

    correlation_id: UUID | None = None
    job_description: str = Field(..., min_length=20)
    role_title: str | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class JdInclusivityRewriteResponse(StubMeta):
    correlation_id: UUID | None = None
    original: str | None = None
    rewritten_markdown: str | None = None
    removed_bias_phrases: list[str] = Field(default_factory=list)
    notes: list[str] = Field(default_factory=list)


class NextQuestionRequest(BaseModel):
    """POST /api/v1/interviews/next-question"""

    correlation_id: UUID | None = None
    interview_id: str
    role_title: str
    job_description: str | None = None
    persona: Persona = Persona.TECHNICAL
    planned_questions: list[str] = Field(default_factory=list)
    asked_question_ids: list[str] = Field(default_factory=list)
    transcript: list[dict[str, Any]] = Field(default_factory=list)
    last_score: float | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class NextQuestionResponse(StubMeta):
    correlation_id: UUID | None = None
    interview_id: str
    question_id: str | None = None
    question_text: str | None = None
    rationale: str | None = None
    done: bool = False


class TtsSynthesizeRequest(BaseModel):
    """POST /api/v1/tts/synthesize — AI interviewer speech."""

    correlation_id: UUID | None = None
    text: str = Field(..., min_length=1, max_length=4000)
    voice_id: str | None = None
    voice_name: str | None = None
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class TtsSynthesizeResponse(StubMeta):
    correlation_id: UUID | None = None
    audio_base64: str | None = None
    mime_type: str = "audio/mpeg"
    voice_id: str | None = None
    provider: str | None = None


class ScenarioGenerateRequest(BaseModel):
    """POST /api/v1/scenarios/generate"""

    correlation_id: UUID | None = None
    role_title: str
    job_description: str | None = None
    difficulty: Difficulty = Difficulty.MEDIUM
    count: int = Field(default=3, ge=1, le=10)
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class ScenarioGenerateResponse(StubMeta):
    correlation_id: UUID | None = None
    scenario_set_id: str | None = None
    scenarios: list[GeneratedQuestion] = Field(default_factory=list)


class ScenarioGradeRequest(BaseModel):
    """POST /api/v1/scenarios/grade"""

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


class ScenarioGradeResponse(StubMeta):
    correlation_id: UUID | None = None
    total_score: float = 0.0
    max_total_score: float = 100.0
    passed: bool | None = None
    feedback_markdown: str | None = None


class InterviewValidateLockRequest(BaseModel):
    """POST /api/v1/interview-preview/validate-lock"""

    correlation_id: UUID | None = None
    role_title: str
    questions: list[dict[str, Any]] = Field(..., min_length=1)
    mandatory_question_ids: list[str] = Field(default_factory=list)
    options: dict[str, Any] = Field(default_factory=dict)


class InterviewValidateLockResponse(StubMeta):
    correlation_id: UUID | None = None
    ready_to_lock: bool = False
    issues: list[str] = Field(default_factory=list)
    warnings: list[str] = Field(default_factory=list)


class FollowUpLogicRequest(BaseModel):
    """POST /api/v1/interview-preview/define-follow-up-logic"""

    correlation_id: UUID | None = None
    role_title: str
    questions: list[dict[str, Any]] = Field(..., min_length=1)
    persona: Persona = Persona.TECHNICAL
    language: str = Field(default="en", min_length=2, max_length=10)
    options: dict[str, Any] = Field(default_factory=dict)


class FollowUpRule(BaseModel):
    question_id: str
    trigger: str
    follow_up_prompt: str
    max_depth: int = 1


class FollowUpLogicResponse(StubMeta):
    correlation_id: UUID | None = None
    rules: list[FollowUpRule] = Field(default_factory=list)
    logic_markdown: str | None = None


class MergeCustomQuestionsRequest(BaseModel):
    """POST /api/v1/interview-preview/merge-custom-questions"""

    correlation_id: UUID | None = None
    role_title: str
    existing_questions: list[dict[str, Any]] = Field(default_factory=list)
    custom_questions: list[dict[str, Any]] = Field(..., min_length=1)
    mandatory_question_ids: 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 MergeCustomQuestionsResponse(StubMeta):
    correlation_id: UUID | None = None
    questions: list[dict[str, Any]] = Field(default_factory=list)
    mandatory_question_ids: list[str] = Field(default_factory=list)
    added_count: int = 0
