from dataclasses import dataclass, field from datetime import datetime from typing import Literal, NamedTuple from fansifter_common.utils import timezone from pydantic import BaseModel from app.models import Campaign, MessageSendQueue @dataclass(kw_only=True) class MessageSendResult: queue_id: str campaign_id: str sent_messages: int timestamp: datetime = field(default_factory=timezone.now) MessageChannel = Literal["SMS", "WHATSAPP"] class PreparedMessage(NamedTuple): channel: MessageChannel sender: str recipient: str message: str media_url: str | list[str] | None class MessageSend(NamedTuple): queue: MessageSendQueue campaign: Campaign messages: list[PreparedMessage] messages_to_send: int send_at: datetime class AudienceFanData(BaseModel): fan_id: str phone_number: str channel: MessageChannel = "SMS" class ProcessableSendQueue(NamedTuple): queue: MessageSendQueue messages_to_send: int