"""Prepare Telegram review deliveries without sending them."""

from __future__ import annotations

from dataclasses import dataclass

TELEGRAM_MESSAGE_LIMIT = 4096
_UNSAFE_PUBLISHING_TERMS = ("publish", "post")


@dataclass(frozen=True)
class ReviewDelivery:
    """A side-effect-free Telegram review delivery plan."""

    text: str
    topic: str
    delivery_type: str = "telegram_review"
    requires_human_approval: bool = True
    side_effects: tuple[str, ...] = ()


def _contains_unsafe_publishing_language(text: str) -> bool:
    normalized = text.casefold()
    return any(term in normalized for term in _UNSAFE_PUBLISHING_TERMS)


def prepare_review_delivery(review_text: str, *, topic: str = "review") -> ReviewDelivery:
    """Validate review text and wrap it as a Telegram delivery plan.

    This function intentionally does not send anything. It creates a boring
    transport-ready object; real Telegram I/O belongs behind an explicit later
    boundary, ideally with Sir watching the button like a suspicious hawk.
    """

    text = review_text.strip()
    if not text:
        raise ValueError("review text is required")
    if len(text) > TELEGRAM_MESSAGE_LIMIT:
        raise ValueError(f"Telegram message exceeds {TELEGRAM_MESSAGE_LIMIT} characters")
    if _contains_unsafe_publishing_language(text):
        raise ValueError("unsafe publishing language is not allowed in review deliveries")

    return ReviewDelivery(text=text, topic=topic)
