from typing import Literal, Optional

from pydantic import BaseModel, EmailStr, field_validator


class ContactEnquiryRequest(BaseModel):
    name: str
    email: EmailStr
    organization: Optional[str] = None
    cemetery_type: Optional[str] = None
    message: Optional[str] = None
    source: str = "marketing"
    website: Optional[str] = None  # honeypot field
    # INDL-04: new optional fields
    role: Optional[str] = None
    phone: Optional[str] = None
    type: str = "contact"

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        v = v.strip()
        if not v:
            raise ValueError("name is required")
        if len(v) > 255:
            raise ValueError("name must be 255 characters or fewer")
        return v

    @field_validator("organization")
    @classmethod
    def validate_organization(cls, v: Optional[str]) -> Optional[str]:
        if v is None:
            return v
        v = v.strip()
        if len(v) > 255:
            raise ValueError("organization must be 255 characters or fewer")
        return v or None

    @field_validator("cemetery_type")
    @classmethod
    def validate_cemetery_type(cls, v: Optional[str]) -> Optional[str]:
        if v is None:
            return v
        v = v.strip()
        if len(v) > 100:
            raise ValueError("cemetery_type must be 100 characters or fewer")
        return v or None

    @field_validator("message")
    @classmethod
    def validate_message(cls, v: Optional[str]) -> Optional[str]:
        if v is None:
            return v
        if len(v) > 5000:
            raise ValueError("message must be 5000 characters or fewer")
        return v


class BookACallRequest(BaseModel):
    name: str
    email: EmailStr
    organization: Optional[str] = None
    cemetery_type: Optional[str] = None
    role: Optional[str] = None
    phone: Optional[str] = None
    day: str
    time: str
    message: Optional[str] = None
    website: Optional[str] = None  # honeypot field
    type: Literal["call"] = "call"

    @field_validator("name")
    @classmethod
    def validate_name(cls, v: str) -> str:
        v = v.strip()
        if not v:
            raise ValueError("name is required")
        if len(v) > 255:
            raise ValueError("name must be 255 characters or fewer")
        return v

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

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

    @field_validator("message")
    @classmethod
    def validate_message(cls, v: Optional[str]) -> Optional[str]:
        if v is None:
            return v
        if len(v) > 5000:
            raise ValueError("message must be 5000 characters or fewer")
        return v
