import uuid from datetime import datetime from typing import Optional from sqlalchemy import DateTime, ForeignKey, JSON, String, Text, func from sqlalchemy import Uuid from sqlalchemy.orm import Mapped, mapped_column from app.models.base import Base, UUIDMixin, TimestampMixin class ContactLead(Base, UUIDMixin, TimestampMixin): __tablename__ = "contact_leads" full_name: Mapped[str] = mapped_column(String(255), nullable=False) email: Mapped[str] = mapped_column(String(255), nullable=False, index=True) phone: Mapped[Optional[str]] = mapped_column(String(50), nullable=True) requested_services: Mapped[Optional[str]] = mapped_column(String(255), nullable=True) pet_name: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) pet_breed: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) suburb: Mapped[Optional[str]] = mapped_column(String(100), nullable=True) service_area_status: Mapped[Optional[str]] = mapped_column(String(32), nullable=True) message: Mapped[Optional[str]] = mapped_column(Text, nullable=True) source: Mapped[str] = mapped_column(String(50), nullable=False, default="contact_form") status: Mapped[str] = mapped_column(String(32), nullable=False, default="invite", index=True) notes: Mapped[Optional[str]] = mapped_column(Text, nullable=True) metadata_json: Mapped[Optional[dict]] = mapped_column("metadata", JSON, nullable=True) invited_at: Mapped[Optional[datetime]] = mapped_column(DateTime(timezone=True), nullable=True) invited_member_id: Mapped[Optional[uuid.UUID]] = mapped_column( Uuid(as_uuid=True), ForeignKey("members.id", ondelete="SET NULL"), nullable=True, index=True, )