"""Scheduling request schemas."""
from datetime import date, time
from typing import List, Optional
from uuid import UUID

from pydantic import BaseModel, field_validator

from src.core.validators import validate_phone


class ServiceCreate(BaseModel):
    service_type: str  # 'interment' | 'memorial' | 'foundation_pour' | 'closure'
    record_id: Optional[UUID] = None
    plot_id: Optional[UUID] = None
    section_id: Optional[UUID] = None
    scheduled_date: date
    scheduled_time: time
    duration_minutes: Optional[int] = 60
    officiant: Optional[str] = None
    family_contact_name: Optional[str] = None
    family_contact_phone: Optional[str] = None
    expected_attendees: Optional[int] = None
    equipment_needed: Optional[str] = None
    notes: Optional[str] = None
    status: str = "draft"  # 'draft' | 'confirmed' | 'tentative' | 'cancelled'
    email_family: bool = False
    add_to_briefing: bool = False
    reminder_24h: bool = False
    assigned_crew_ids: List[UUID] = []

    @field_validator('family_contact_phone', mode='before')
    @classmethod
    def _validate_phone(cls, v: Optional[str]) -> Optional[str]:
        return validate_phone(v)


class ExportWeekPdfRequest(BaseModel):
    week_start: date


class ServiceUpdate(BaseModel):
    service_type: Optional[str] = None
    record_id: Optional[UUID] = None
    plot_id: Optional[UUID] = None
    section_id: Optional[UUID] = None
    scheduled_date: Optional[date] = None
    scheduled_time: Optional[time] = None
    duration_minutes: Optional[int] = None
    officiant: Optional[str] = None
    family_contact_name: Optional[str] = None
    family_contact_phone: Optional[str] = None
    expected_attendees: Optional[int] = None
    equipment_needed: Optional[str] = None
    notes: Optional[str] = None
    status: Optional[str] = None
    email_family: Optional[bool] = None
    add_to_briefing: Optional[bool] = None
    reminder_24h: Optional[bool] = None
    assigned_crew_ids: Optional[List[UUID]] = None

    @field_validator('family_contact_phone', mode='before')
    @classmethod
    def _validate_phone(cls, v: Optional[str]) -> Optional[str]:
        return validate_phone(v)
