"""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
