from datetime import date, datetime from typing import Annotated, Literal from pydantic import BaseModel, Field class Metadata(BaseModel): createdOn: datetime | None = None updatedOn: datetime | None = None class ParentBase(BaseModel): name: str email: str phone: str | None = None metadata: Metadata | None = None class ParentCreate(ParentBase): pass class Parent(ParentBase): id: int class VetBase(BaseModel): name: str specialty: str | None = None email: str phone: str | None = None metadata: Metadata | None = None class VetCreate(VetBase): pass class Vet(VetBase): id: int class ProcedureNoteBase(BaseModel): summary: str | None = None details: str | None = None class BasicNote(ProcedureNoteBase): noteType: Literal["basic"] = "basic" class HeartRateNote(ProcedureNoteBase): noteType: Literal["heart_rate"] = "heart_rate" bpm: int class DentalNote(ProcedureNoteBase): noteType: Literal["dental"] = "dental" procedureType: Literal["scaling", "polishing"] teeth: str | None = None class VaccineNote(ProcedureNoteBase): noteType: Literal["vaccine"] = "vaccine" medicine: Literal["Rabies", "DHPP", "Tricat", "Deworming"] leg: Literal["front_left", "front_right", "hind_left", "hind_right"] class PreOpNote(ProcedureNoteBase): noteType: Literal["preop"] = "preop" heartRate: int temperature: float class SurgeryNote(ProcedureNoteBase): noteType: Literal["surgery"] = "surgery" surgeryType: Literal["neuter", "spay"] complications: str | None = None ProcedureNotes = Annotated[ BasicNote | HeartRateNote | DentalNote | VaccineNote | PreOpNote | SurgeryNote, Field(discriminator="noteType"), ] class Procedure(BaseModel): name: str | None = None description: str | None = None cost: float | None = None notes: ProcedureNotes | None = None class TreatmentBase(BaseModel): label: str description: str | None = None metadata: Metadata | None = None class TreatmentCreate(TreatmentBase): pass class Treatment(TreatmentBase): id: int class PetBase(BaseModel): name: str species: str age: int | None = None weight: float | None = None birthDate: date | None = None photo: str | None = None metadata: Metadata | None = None class PetCreate(PetBase): parent_ids: list[int] = [] class Pet(PetBase): id: int parents: list[Parent] = [] class AppointmentBase(BaseModel): date: datetime notes: str | None = None procedures: list[Procedure] = [] metadata: Metadata | None = None class AppointmentCreate(AppointmentBase): pet_id: int vet_id: int treatment_id: int class Appointment(AppointmentBase): id: int pet: Pet vet: Vet treatment: Treatment