"""
Patient portal schemas: PIN login, visits, appointments, and own-report access.
"""

from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field


class PatientLoginRequest(BaseModel):
    """Patient portal sign-in with the bill-printed phone + PIN."""

    phone: str = Field(..., min_length=7, max_length=20, description="Registered mobile number")
    pin: str = Field(..., min_length=1, max_length=20, description="Portal PIN from the bill receipt")


class PatientPortalProfile(BaseModel):
    """Authenticated patient identity."""

    model_config = ConfigDict(from_attributes=True)

    id: UUID
    name: str
    phone: str
    lab_id: UUID


class PatientTokenResponse(BaseModel):
    """Patient session tokens (access only — re-login after expiry)."""

    access_token: str
    token_type: str = "bearer"
    expires_in: int = Field(..., description="Access token lifetime in seconds")
    patient: PatientPortalProfile


class PortalVisitReport(BaseModel):
    """One released document on a visit."""

    id: UUID
    modality: str
    version: int
    released_at: datetime | None = None


class PortalVisit(BaseModel):
    """One lab visit with its released documents."""

    order_number: str
    date: datetime
    status: str
    reports: list[PortalVisitReport] = Field(default_factory=list)


class PortalAppointment(BaseModel):
    """One booked appointment."""

    id: UUID
    date: datetime
    status: str
    notes: str | None = None


class PortalOverviewResponse(BaseModel):
    """Patient home: visits and appointments newest-first."""

    patient_name: str
    visits: list[PortalVisit] = Field(default_factory=list)
    appointments: list[PortalAppointment] = Field(default_factory=list)
