from pydantic import BaseModel, Field class DraftSeatItem(BaseModel): seat_record_id: str scheme_id: str scheme_version_id: str element_id: str | None seat_id: str | None sector_id: str | None group_id: str | None row_label: str | None seat_number: str | None tag: str | None classes_raw: str | None x: float | None y: float | None cx: float | None cy: float | None width: float | None height: float | None created_at: str class DraftSectorItem(BaseModel): sector_record_id: str scheme_id: str scheme_version_id: str element_id: str | None sector_id: str | None name: str | None classes_raw: str | None created_at: str class DraftGroupItem(BaseModel): group_record_id: str scheme_id: str scheme_version_id: str element_id: str | None group_id: str | None name: str | None classes_raw: str | None created_at: str class DraftStructureResponse(BaseModel): scheme_id: str scheme_version_id: str status: str seats: list[DraftSeatItem] sectors: list[DraftSectorItem] groups: list[DraftGroupItem] total_seats: int total_sectors: int total_groups: int class EditorContextResponse(BaseModel): scheme_id: str current_scheme_version_id: str current_version_number: int scheme_status: str scheme_version_status: str editor_available: bool current_is_draft: bool create_draft_available: bool recommended_action: str class DraftSummaryResponse(BaseModel): scheme_id: str scheme_version_id: str status: str total_seats: int total_sectors: int total_groups: int validation_summary: dict structure_diff_summary: dict publish_readiness: dict class SeatPatchRequest(BaseModel): seat_id: str | None = Field(default=None, max_length=128) sector_id: str | None = Field(default=None, max_length=128) group_id: str | None = Field(default=None, max_length=128) row_label: str | None = Field(default=None, max_length=64) seat_number: str | None = Field(default=None, max_length=64) class SeatPatchResponse(BaseModel): scheme_id: str scheme_version_id: str element_id: str | None seat_id: str | None sector_id: str | None group_id: str | None row_label: str | None seat_number: str | None class BulkSeatPatchItem(BaseModel): seat_record_id: str = Field(..., max_length=32) seat_id: str | None = Field(default=None, max_length=128) sector_id: str | None = Field(default=None, max_length=128) group_id: str | None = Field(default=None, max_length=128) row_label: str | None = Field(default=None, max_length=64) seat_number: str | None = Field(default=None, max_length=64) class BulkSeatPatchRequest(BaseModel): items: list[BulkSeatPatchItem] = Field(..., min_length=1, max_length=500) class BulkSeatPatchResultItem(BaseModel): seat_record_id: str updated_seat_id: str | None sector_id: str | None group_id: str | None row_label: str | None seat_number: str | None class BulkSeatPatchResponse(BaseModel): scheme_id: str scheme_version_id: str updated_count: int items: list[BulkSeatPatchResultItem] class SectorPatchRequest(BaseModel): sector_id: str | None = Field(default=None, max_length=128) name: str | None = Field(default=None, max_length=255) class SectorPatchResponse(BaseModel): scheme_id: str scheme_version_id: str element_id: str | None sector_id: str | None name: str | None class GroupPatchRequest(BaseModel): group_id: str | None = Field(default=None, max_length=128) name: str | None = Field(default=None, max_length=255) class GroupPatchResponse(BaseModel): scheme_id: str scheme_version_id: str element_id: str | None group_id: str | None name: str | None class CreateSectorRequest(BaseModel): element_id: str | None = Field(default=None, max_length=255) sector_id: str = Field(..., max_length=128) name: str | None = Field(default=None, max_length=255) classes_raw: str | None = Field(default=None, max_length=4000) class CreateGroupRequest(BaseModel): element_id: str | None = Field(default=None, max_length=255) group_id: str = Field(..., max_length=128) name: str | None = Field(default=None, max_length=255) classes_raw: str | None = Field(default=None, max_length=4000) class CreateSectorResponse(BaseModel): scheme_id: str scheme_version_id: str sector_record_id: str element_id: str | None sector_id: str name: str | None class CreateGroupResponse(BaseModel): scheme_id: str scheme_version_id: str group_record_id: str element_id: str | None group_id: str name: str | None class DeleteEntityResponse(BaseModel): scheme_id: str scheme_version_id: str deleted: bool record_id: str class RepairReferencesResponse(BaseModel): scheme_id: str scheme_version_id: str repaired_sector_refs_count: int repaired_group_refs_count: int details: dict class StructureDiffEntityItem(BaseModel): key: str status: str before: dict | None after: dict | None class StructureDiffResponse(BaseModel): scheme_id: str draft_scheme_version_id: str baseline_scheme_version_id: str | None summary: dict sectors: list[StructureDiffEntityItem] groups: list[StructureDiffEntityItem] seats: list[StructureDiffEntityItem]