from __future__ import annotations from typing import List, Optional, Dict from pydantic import BaseModel, Field class WorkExperience(BaseModel): title: str company: str start_date: Optional[str] = None end_date: Optional[str] = None location: Optional[str] = None achievements: List[str] = Field(default_factory=list) technologies: List[str] = Field(default_factory=list) class Education(BaseModel): school: str degree: Optional[str] = None field_of_study: Optional[str] = None start_date: Optional[str] = None end_date: Optional[str] = None class UserProfile(BaseModel): full_name: str headline: Optional[str] = None summary: Optional[str] = None email: Optional[str] = None phone: Optional[str] = None location: Optional[str] = None skills: List[str] = Field(default_factory=list) experiences: List[WorkExperience] = Field(default_factory=list) education: List[Education] = Field(default_factory=list) links: Dict[str, str] = Field(default_factory=dict) class JobPosting(BaseModel): id: str title: str company: str location: Optional[str] = None description: str url: Optional[str] = None source: Optional[str] = None saved_by_user: bool = False seniority: Optional[str] = None employment_type: Optional[str] = None metadata: Optional[Dict[str, object]] = None class ResumeDraft(BaseModel): job_id: str text: str keywords_used: List[str] = Field(default_factory=list) class CoverLetterDraft(BaseModel): job_id: str text: str keywords_used: List[str] = Field(default_factory=list) class OrchestrationResult(BaseModel): job: JobPosting resume: ResumeDraft cover_letter: CoverLetterDraft metrics: Optional[Dict[str, object]] = None