from __future__ import annotations from typing import Dict, List, Optional from pydantic import BaseModel, Field class FileMeta(BaseModel): id: str name: str size: int content_type: str category: str url: Optional[str] = None class Heading(BaseModel): number: str = "" name: str = "" class PageTemplateDefinition(BaseModel): id: str name: str description: str = "" blank: bool = False variant: str = "full" photo_layout: str = "auto" source: str = "custom" class SessionResponse(BaseModel): id: str status: str created_at: str updated_at: str document_no: str inspection_date: str uploads: Dict[str, List[FileMeta]] = Field(default_factory=dict) selected_photo_ids: List[str] = Field(default_factory=list) page_count: int = 0 headings: List[Heading] = Field(default_factory=list) jobsheet_sections: List["JobsheetSection"] = Field(default_factory=list) page_templates: List[PageTemplateDefinition] = Field(default_factory=list) class SessionStatusResponse(BaseModel): id: str status: str updated_at: str class SelectionRequest(BaseModel): selected_photo_ids: List[str] = Field(default_factory=list) class PagesResponse(BaseModel): pages: List[dict] = Field(default_factory=list) class PagesRequest(BaseModel): pages: List[dict] = Field(default_factory=list) class JobsheetSection(BaseModel): id: str title: Optional[str] = None pages: List[dict] = Field(default_factory=list) class SectionsResponse(BaseModel): sections: List[JobsheetSection] = Field(default_factory=list) class SectionsRequest(BaseModel): sections: List[JobsheetSection] = Field(default_factory=list) class HeadingsRequest(BaseModel): headings: List[Heading] = Field(default_factory=list) class HeadingsResponse(BaseModel): headings: List[Heading] = Field(default_factory=list) class PageTemplatesRequest(BaseModel): page_templates: List[PageTemplateDefinition] = Field(default_factory=list) class PageTemplatesResponse(BaseModel): page_templates: List[PageTemplateDefinition] = Field(default_factory=list)