from datetime import datetime
from decimal import Decimal
from typing import Optional
from uuid import UUID
from pydantic import BaseModel, ConfigDict, computed_field

TOPIC_LABELS = {
    "finding_record": "Finding a loved one's record",
    "memorial_tribute": "Memorial edit or tribute question",
    "pre_need_plot": "Pre-need plot planning",
    "service_arrangement": "Arranging a service",
    "genealogy_research": "Heritage / genealogy research",
    "other": "Something else",
}


class ContactInquiryOut(BaseModel):
    model_config = ConfigDict(from_attributes=True)

    id: UUID
    tenant_id: UUID
    reference_id: str
    source_type: str
    sender_name: str
    sender_email: Optional[str] = None
    sender_phone: Optional[str] = None
    message: Optional[str] = None
    status: str
    converted_opportunity_id: Optional[UUID] = None

    # contact_form (INDL-24)
    topic: Optional[str] = None
    person_or_plot: Optional[str] = None
    subscribe_newsletter: bool = False

    @computed_field  # type: ignore[misc]
    @property
    def topic_label(self) -> Optional[str]:
        return TOPIC_LABELS.get(self.topic) if self.topic else None

    # plot_availability
    plot_number: Optional[str] = None
    section_name: Optional[str] = None
    listed_price: Optional[Decimal] = None

    # call_booking
    call_date: Optional[datetime] = None
    agent_name: Optional[str] = None
    notes: Optional[str] = None

    # email
    email_subject: Optional[str] = None
    email_received_at: Optional[datetime] = None

    created_at: datetime
    updated_at: datetime
