"""Schemas for FlowPilot survey submission.""" from datetime import datetime from typing import Any, Optional from pydantic import BaseModel, Field class SurveySubmission(BaseModel): """Incoming survey response from the public form.""" respondent_name: Optional[str] = Field(None, max_length=255) responses: dict[str, Any] = Field( ..., description="Question ID -> answer mapping. Values can be strings, lists, or numbers.", ) token: Optional[str] = Field(None, description="Invite token for tracking") class SurveySubmissionResponse(BaseModel): """Response after successful submission.""" message: str = "Thank you for your response!" id: str class SurveyInviteCreate(BaseModel): """Create a new survey invite.""" recipient_name: str = Field(..., min_length=1, max_length=255) recipient_email: Optional[str] = Field(None, max_length=255) send_email: bool = False class SurveyInviteResponse(BaseModel): """Invite details returned to admin.""" id: str token: str recipient_name: str recipient_email: Optional[str] status: str email_sent: bool created_at: datetime completed_at: Optional[datetime] survey_url: str class SurveyInviteStatus(BaseModel): """Public invite status check — minimal info.""" name: str status: str class SurveyEmailCopyRequest(BaseModel): """Request to email a copy of responses to the respondent.""" email: str = Field(..., max_length=255) response_id: str class SurveyResponseDetail(BaseModel): """Full survey response returned to admin.""" id: str respondent_name: Optional[str] responses: dict[str, Any] source: str invite_name: Optional[str] is_read: bool = False archived_at: Optional[datetime] = None created_at: datetime class SurveyResponseListResponse(BaseModel): """List of survey responses with summary stats.""" responses: list[SurveyResponseDetail] total: int this_week: int unread: int