""" Strongly typed domain models for Patient Onboarding state management. """ from typing import Any, Dict, List, Optional, Union from pydantic import BaseModel, Field class SymptomItem(BaseModel): name: str canonical_name: Optional[str] = None duration: Optional[str] = None severity: Optional[str] = None location: Optional[str] = None frequency: Optional[str] = None onset: Optional[str] = None pattern: Optional[str] = None trigger: Optional[str] = None relieving_factor: Optional[str] = None associated_findings: Optional[str] = None class MedicationItem(BaseModel): name: str canonical_name: Optional[str] = None dosage: Optional[str] = None frequency: Optional[str] = None duration: Optional[str] = None purpose: Optional[str] = None class AllergyItem(BaseModel): name: str canonical_name: Optional[str] = None type: Optional[str] = None # e.g., 'drug', 'food', 'environment' reaction: Optional[str] = None # e.g., 'rash', 'swelling' class MedicalHistoryItem(BaseModel): condition: str canonical_name: Optional[str] = None duration: Optional[str] = None status: Optional[str] = "active" details: Optional[str] = None class SurgicalHistoryItem(BaseModel): procedure: str body_site: Optional[str] = None approximate_date: Optional[str] = None reason: Optional[str] = None class PreviousEpisodeItem(BaseModel): description: str time: Optional[str] = None outcome: Optional[str] = None class FamilyHistoryItem(BaseModel): relation: str # e.g., 'father', 'mother', 'sibling' condition: str canonical_name: Optional[str] = None class FieldContainer(BaseModel): status: str = "not_collected" # 'not_collected' | 'reported' | 'confirmed_none' | 'unknown' | 'declined' items: List[Dict[str, Any]] = Field(default_factory=list) class SpecialtyConfidence(BaseModel): code: str name: str confidence: float = 1.0 evidence: List[str] = Field(default_factory=list) class PatientState(BaseModel): reason_for_visit: Optional[str] = None symptoms: List[SymptomItem] = Field(default_factory=list) medical_history: Union[FieldContainer, List[MedicalHistoryItem], Dict[str, Any]] = Field(default_factory=list) medications: Union[FieldContainer, List[MedicationItem], Dict[str, Any]] = Field(default_factory=list) allergies: Union[FieldContainer, List[AllergyItem], Dict[str, Any]] = Field(default_factory=list) surgical_history: List[SurgicalHistoryItem] = Field(default_factory=list) previous_episodes: List[PreviousEpisodeItem] = Field(default_factory=list) family_history: List[FamilyHistoryItem] = Field(default_factory=list) additional_information: List[Dict[str, Any]] = Field(default_factory=list)