# FILE: src/apps/public/schemas/plot_inquiry.py
from __future__ import annotations

import re
from typing import Literal, Optional
from uuid import UUID

from pydantic import BaseModel, EmailStr, field_validator, model_validator

_PHONE_RE = re.compile(r"^(\(\d{3}\)\s?\d{3}-\d{4}|\+1\d{10})$")

RELATIONSHIP_VALUES = (
    "Planning for myself",
    "Planning for a parent",
    "Planning for a spouse",
    "Planning for another family member",
    "Funeral home representative",
    "Other",
)


class PlotInquiryRequest(BaseModel):
    plot_ref: str
    plot_id: Optional[UUID] = None
    sender_name: str
    sender_email: Optional[EmailStr] = None
    sender_phone: Optional[str] = None
    relationship: Literal[
        "Planning for myself",
        "Planning for a parent",
        "Planning for a spouse",
        "Planning for another family member",
        "Funeral home representative",
        "Other",
    ]
    preferred_contact_time: Optional[str] = None
    message: Optional[str] = None
    website: Optional[str] = None  # honeypot field

    @field_validator("plot_ref")
    @classmethod
    def validate_plot_ref(cls, v: str) -> str:
        v = v.strip()
        if not v:
            raise ValueError("plot_ref is required")
        return v

    @field_validator("sender_name")
    @classmethod
    def validate_sender_name(cls, v: str) -> str:
        v = v.strip()
        if len(v) < 2 or len(v) > 255:
            raise ValueError("Please enter your full name")
        return v

    @field_validator("sender_phone")
    @classmethod
    def validate_sender_phone(cls, v: Optional[str]) -> Optional[str]:
        if v is None or v == "":
            return v
        if not _PHONE_RE.match(v):
            raise ValueError("Please enter a valid phone number")
        return v

    @field_validator("message")
    @classmethod
    def validate_message(cls, v: Optional[str]) -> Optional[str]:
        if v is None:
            return v
        if len(v) > 2000:
            raise ValueError("Message must not exceed 2000 characters")
        return v

    @model_validator(mode="after")
    def validate_contact_method(self) -> "PlotInquiryRequest":
        if not self.sender_email and not self.sender_phone:
            raise ValueError("Please provide at least an email or phone number")
        return self
