"""Pre-redaction privacy scan for captured disposable Telegram text."""

from __future__ import annotations

import hashlib
from collections.abc import Sequence
from dataclasses import dataclass

from gateway.platforms.nutrition_weekly_owner_card import (
    weekly_owner_card_fields_whitelisted,
)
from scripts.nutricoach_v140_fake_telegram import CapturedTelegramText
from scripts.nutricoach_v140_runtime import JsonValue


@dataclass(frozen=True, slots=True)
class PrivacyScan:
    receipt: dict[str, JsonValue]
    transcript: list[JsonValue]
    leaks: int


def _digest(value: str) -> str:
    return hashlib.sha256(value.encode()).hexdigest()


def scan_captured_texts(
    captures: Sequence[CapturedTelegramText],
    sentinels: Sequence[str],
) -> PrivacyScan:
    """Inspect raw in-memory text, then return hashes and booleans only."""
    sentinel_rows: list[JsonValue] = []
    leaks = 0
    combined = "\n".join(item.text for item in captures).casefold()
    for sentinel in sentinels:
        absent = sentinel.casefold() not in combined
        leaks += int(not absent)
        sentinel_rows.append({
            "sentinel_sha256": _digest(sentinel.casefold()), "absent": absent,
        })
    transcript: list[JsonValue] = []
    owner_cards = 0
    owner_whitelist = True
    for item in captures:
        is_owner_card = item.text.startswith("주간 운영 집계 검토")
        whitelisted = (
            weekly_owner_card_fields_whitelisted(item.text)
            if is_owner_card else True
        )
        owner_cards += int(is_owner_card)
        owner_whitelist = owner_whitelist and whitelisted
        transcript.append({
            "method": item.method,
            "chat_id": item.chat_id,
            "topic_id": item.topic_id,
            "message_id": item.message_id,
            "text_sha256": _digest(item.text),
            "raw_sentinels_absent": all(
                sentinel.casefold() not in item.text.casefold()
                for sentinel in sentinels
            ),
            "owner_weekly_fields_whitelisted": whitelisted,
        })
    if owner_cards == 0 or not owner_whitelist:
        leaks += 1
    receipt: dict[str, JsonValue] = {
        "raw_capture_count": len(captures),
        "owner_weekly_card_count": owner_cards,
        "owner_weekly_fields_whitelisted": owner_whitelist and owner_cards > 0,
        "sentinel_checks": sentinel_rows,
        "raw_text_persisted": False,
    }
    return PrivacyScan(receipt, transcript, leaks)