"""
Pydantic schemas for CV endpoints (Phase 1.5).

Frontend sends camelCase JSON; CamelCaseModel handles bidirectional mapping.
PersonalInfo is built backend-side from profiles + auth.users, never sent
by the frontend.
"""

from typing import Optional, List
from uuid import UUID

from pydantic import BaseModel, Field

from app.schemas.base import CamelCaseModel


# ============================================
# Input schemas (frontend → backend)
# ============================================

class ExperienceInput(CamelCaseModel):
    """Single experience entry sent by the frontend."""
    position: str
    company: str
    description: str
    year_start: Optional[int] = None
    month_start: Optional[int] = None
    year_end: Optional[int] = None
    month_end: Optional[int] = None
    is_present: bool = False


class FormationInput(CamelCaseModel):
    """Single formation entry sent by the frontend."""
    degree: str
    institution: str
    year_start: Optional[int] = None
    month_start: Optional[int] = None
    year_end: Optional[int] = None
    month_end: Optional[int] = None
    is_present: bool = False


class LanguageInput(CamelCaseModel):
    """Single language entry sent by the frontend."""
    name: str
    level: str  # 'beginner' | 'intermediate' | 'advanced' | 'native'


class CVPayloadInput(CamelCaseModel):
    """
    Full CV payload received from frontend at POST /cvs/me.
    NOTE: No personal_info — built backend-side from profiles + auth.users.
    """
    profil: str = Field(default="", max_length=2000)
    experiences: List[ExperienceInput] = Field(default_factory=list)
    formations: List[FormationInput] = Field(default_factory=list)
    skills: List[str] = Field(default_factory=list)
    languages: List[LanguageInput] = Field(default_factory=list)


# ============================================
# Internal schema (built backend-side for PDF template)
# ============================================

class PersonalInfo(CamelCaseModel):
    """Personal info built backend-side from profiles + auth.users.email."""
    full_name: str
    job_title: str
    phone: str
    email: str
    address: str


# ============================================
# Output schema — full CV (built backend-side)
# ============================================

class CVOutput(CamelCaseModel):
    """
    Full CV returned to frontend after POST /cvs/me succeeds.
    Mirrors the row persisted in public.cvs, with personal_info built
    from profiles + auth.users (amendment #12). Frontend uses this as
    the single source of truth for the CV preview (CVViewerModal).
    """
    personal_info: PersonalInfo
    profil: str
    experiences: List[ExperienceInput]
    formations: List[FormationInput]
    skills: List[str]
    languages: List[LanguageInput]


# ============================================
# Output schema (backend → frontend)
# ============================================

class CVResponse(CamelCaseModel):
    """Response returned by POST /cvs/me."""
    cv_id: UUID
    pdf_url: Optional[str] = None
    cv: Optional[CVOutput] = None
    warning: Optional[str] = None
