"""Pydantic request/response models for the mail API.""" from __future__ import annotations from typing import Any from pydantic import BaseModel, EmailStr class BaseSubmission(BaseModel): fullName: str email: EmailStr phone: str website: str = "" formStartedAt: int | None = None visitStartedAt: int | None = None pageEnteredAt: int | None = None firstInteractionAt: int | None = None sendClickedAt: int | None = None referrer: str = "" page: str = "" class BookingSubmission(BaseSubmission): enquiryType: str = "booking" petName: str = "" location: str = "" message: str = "" services: list[str] = [] stepChanges: int = 0 journey: list[str] = [] class OnboardingSubmission(BaseSubmission): address: str dogName: str dogBreed: str dogAge: str = "" servicesNeeded: list[str] = [] temperament: str = "" medicalNotes: str = "" accessInstructions: str = "" vetName: str vetPhone: str emergencyContactName: str emergencyContactPhone: str councilRegistrationConfirmed: bool = False vaccinationsConfirmed: bool = False emergencyVetConsent: bool = False termsAccepted: bool = False signatureDataUrl: str submissionSnapshot: dict[str, Any] = {} class WelcomePackEmailRequest(BaseModel): email: EmailStr serviceType: str priceDetails: str startDate: str preview: bool = False class BirthdayEmailRequest(BaseModel): email: EmailStr preview: bool = False class BirthdayAutoSendRequest(BaseModel): email: EmailStr enabled: bool class ContractSubmission(BaseSubmission): address: str dogName: str dogBreed: str dogAge: str = "" serviceType: str startDate: str walkFrequency: str = "" additionalNotes: str = "" agreeServiceTerms: bool = False agreeCancellation: bool = False agreePayment: bool = False agreeEmergency: bool = False agreeLiability: bool = False agreeAccuracy: bool = False signatureDataUrl: str class RenderMessageRequest(BaseModel): templateId: str heading: str = "" body: str = "" ctaLabel: str = "" ctaUrl: str = "" subHeading: str = "" highlightText: str = "" signOff: str = "" footerNote: str = "" fontId: str = "system" class SendMessageRequest(BaseModel): templateId: str subject: str heading: str = "" body: str = "" ctaLabel: str = "" ctaUrl: str = "" subHeading: str = "" highlightText: str = "" signOff: str = "" footerNote: str = "" fontId: str = "system" recipients: list[EmailStr] = [] preview: bool = False