from typing import Literal, Optional
from datetime import date, time
from uuid import UUID
from pydantic import BaseModel, ConfigDict, EmailStr, Field


class CreateRecordRequest(BaseModel):
    plot_id: Optional[UUID] = None
    first_name: str = Field(..., max_length=100)
    middle_name: Optional[str] = Field(None, max_length=100)
    last_name: str = Field(..., max_length=100)
    maiden_name: Optional[str] = Field(None, max_length=100)
    date_of_birth: Optional[date] = None
    date_of_death: Optional[date] = None
    gender: Optional[str] = Field(None, max_length=20)
    nationality: Optional[str] = Field(None, max_length=100)
    religion: Optional[str] = Field(None, max_length=100)
    is_veteran: bool = False
    military_branch: Optional[str] = Field(None, max_length=100)
    visibility_config: Literal["public", "private", "family_only"] = "public"
    status: Literal["active", "draft", "archived"] = "active"
    headstone_photo_s3_key: Optional[str] = None


class UpdateRecordRequest(BaseModel):
    model_config = ConfigDict(extra='forbid')
    plot_id: Optional[UUID] = None
    first_name: Optional[str] = Field(None, max_length=100)
    middle_name: Optional[str] = Field(None, max_length=100)
    last_name: Optional[str] = Field(None, max_length=100)
    maiden_name: Optional[str] = Field(None, max_length=100)
    date_of_birth: Optional[date] = None
    date_of_death: Optional[date] = None
    gender: Optional[str] = Field(None, max_length=20)
    nationality: Optional[str] = Field(None, max_length=100)
    religion: Optional[str] = Field(None, max_length=100)
    is_veteran: Optional[bool] = None
    military_branch: Optional[str] = Field(None, max_length=100)
    photo_url: Optional[str] = None
    biography_draft: Optional[str] = Field(None, max_length=10000)
    visibility_config: Optional[Literal["public", "private", "family_only"]] = None
    status: Optional[Literal["active", "draft", "archived"]] = None
    headstone_photo_s3_key: Optional[str] = None


class CreateBurialInfoRequest(BaseModel):
    interment_type: Optional[str] = Field(None, max_length=50)
    interment_date: Optional[date] = None
    interment_time: Optional[time] = None
    casket_type: Optional[str] = Field(None, max_length=100)
    depth_m: Optional[float] = None
    officiant: Optional[str] = Field(None, max_length=255)
    attendees: Optional[int] = None
    service_notes: Optional[str] = Field(None, max_length=2000)


class UpdateBurialInfoRequest(BaseModel):
    model_config = ConfigDict(extra='forbid')
    interment_type: Optional[str] = Field(None, max_length=50)
    interment_date: Optional[date] = None
    interment_time: Optional[time] = None
    casket_type: Optional[str] = Field(None, max_length=100)
    depth_m: Optional[float] = None
    officiant: Optional[str] = Field(None, max_length=255)
    attendees: Optional[int] = None
    service_notes: Optional[str] = Field(None, max_length=2000)


class CreateFamilyContactRequest(BaseModel):
    relationship: Optional[str] = Field(None, max_length=100)
    first_name: str = Field(..., max_length=100)
    last_name: str = Field(..., max_length=100)
    email: Optional[EmailStr] = None
    phone: Optional[str] = Field(None, max_length=50)
    address: Optional[str] = None
    is_primary: bool = False
    is_plot_owner: bool = False


class UpdateFamilyContactRequest(BaseModel):
    model_config = ConfigDict(extra='forbid')
    relationship: Optional[str] = Field(None, max_length=100)
    first_name: Optional[str] = Field(None, max_length=100)
    last_name: Optional[str] = Field(None, max_length=100)
    email: Optional[EmailStr] = None
    phone: Optional[str] = Field(None, max_length=50)
    address: Optional[str] = Field(None, max_length=255)
    is_primary: Optional[bool] = None
    is_plot_owner: Optional[bool] = None
