"""
Pydantic schemas for sample collection and specimen tracking.
"""

from datetime import datetime
from uuid import UUID

from pydantic import BaseModel, ConfigDict, Field

from app.models.order import SampleStatus


class SampleBase(BaseModel):
    """Base sample attributes."""

    sample_type: str = Field(
        ...,
        min_length=1,
        max_length=100,
        description="Type of specimen (e.g. blood, urine, EDTA whole blood)",
    )
    notes: str | None = Field(
        None, max_length=1000, description="Collection notes, specimen condition remarks"
    )


class SampleCreate(SampleBase):
    """Schema for creating a sample record under an order."""

    pass


class SampleCollectRequest(BaseModel):
    """Payload when phlebotomist collects specimen."""

    collected_at: datetime | None = Field(
        None, description="Collection timestamp; defaults to current time if omitted"
    )
    notes: str | None = Field(None, max_length=1000, description="Optional collection remarks")


class SampleRejectRequest(BaseModel):
    """Payload when specimen is rejected or defective."""

    notes: str = Field(
        ...,
        min_length=2,
        max_length=1000,
        description="Mandatory reason for sample rejection (e.g., clotted, hemolyzed, insufficient volume)",
    )


class SampleResponse(BaseModel):
    """Standard sample response contract."""

    model_config = ConfigDict(from_attributes=True)

    id: UUID
    order_id: UUID
    lab_id: UUID
    sample_code: str
    barcode: str
    sample_type: str
    status: SampleStatus
    collected_by: UUID | None = None
    collected_at: datetime | None = None
    notes: str | None = None
    collector_name: str | None = None
    created_at: datetime
    updated_at: datetime


class SampleDetailResponse(SampleResponse):
    """Detailed sample payload including order and patient context."""

    order_number: str | None = None
    patient_id: UUID | None = None
    patient_name: str | None = None
    patient_code: str | None = None
    patient_phone: str | None = None
    patient_gender: str | None = None
    patient_age: int | None = None
    tests_summary: str | None = None
    report_status: str | None = None
    verified_by_name: str | None = None
    is_dispatched: bool = False
