"""Privacy-whitelisted Telegram card for grounded weekly owner drafts."""

from __future__ import annotations

from typing import Final, Protocol

from .nutrition_coaching_proposal import CoachReview


class WeeklyOwnerCardAction(Protocol):
    @property
    def status(self) -> str: ...

    @property
    def owner_card_text(self) -> str | None: ...

    @property
    def coach_review(self) -> CoachReview | None: ...


_REQUIRED: Final = frozenset((
    "starts_on", "ends_on", "submitted_count", "late_count", "missed_count",
    "completed_days", "calendar_days", "adherence_percent", "weight_trend",
    "reminder_sent_count", "reminder_incident_count", "week_status",
    "decision_options", "decision", "actions", "source_aggregate_digest",
))

WEEKLY_OWNER_CARD_PREFIXES: Final = (
    "주간 운영 집계 검토", "기간:", "주 상태:", "제출 집계:", "완료 집계:",
    "준수율:", "주간 추세:", "리마인더 집계:", "결정 선택지:", "결정:",
    "소유자 행동:", "카드 상태:", "승인 전 고객 전송:", "수정 안내:",
)


def _status(value: str) -> str:
    return {
        "created": "approval_pending",
        "edited": "approval_pending_edited",
        "approved": "approved_send_pending",
        "held": "held",
        "sent": "sent_audited",
        "sent_audited": "sent_audited",
    }.get(value, "pending")


def render_weekly_owner_card(action: WeeklyOwnerCardAction) -> str | None:
    """Render only the Todo8 aggregate, decision, action, and card state."""
    if action.owner_card_text is not None:
        status = _status(action.status)
        return "\n".join(
            f"카드 상태: {status}" if line.startswith("카드 상태:") else line
            for line in action.owner_card_text.splitlines()
        )
    review = action.coach_review
    if review is None:
        return None
    facts = dict(review.facts)
    if not _REQUIRED.issubset(facts):
        return None
    status = _status(action.status)
    return "\n".join((
        "주간 운영 집계 검토",
        f"기간: {facts['starts_on']}~{facts['ends_on']}",
        f"주 상태: {facts['week_status']}",
        "제출 집계: "
        + f"submitted={facts['submitted_count']}, late={facts['late_count']}, "
        + f"missed={facts['missed_count']}",
        f"완료 집계: {facts['completed_days']}/{facts['calendar_days']}",
        f"준수율: {facts['adherence_percent']}%",
        f"주간 추세: {facts['weight_trend']}",
        "리마인더 집계: "
        + f"sent={facts['reminder_sent_count']}, "
        + f"incident={facts['reminder_incident_count']}",
        f"결정 선택지: {facts['decision_options']}",
        f"결정: {facts['decision']}",
        f"소유자 행동: {facts['actions']}",
        f"카드 상태: {status}",
        "승인 전 고객 전송: blocked",
    ))


def weekly_owner_card_fields_whitelisted(text: str) -> bool:
    """Prove every persisted owner-card line belongs to the approved schema."""
    lines = text.splitlines()
    return bool(lines) and all(
        any(line.startswith(prefix) for prefix in WEEKLY_OWNER_CARD_PREFIXES)
        for line in lines
    )