"""Ergebnisprüfung vor der Rückgabe an Telegram.

1. Secret-Muster (dieselben Regeln wie der Datenschutz-Klassifikator)
   werden geschwärzt und markiert: [GESCHWÄRZT:<regel>].
2. Danach wird auf max_chars gekürzt und markiert ([… gekürzt]).
   Reihenfolge ist Absicht: erst schwärzen, dann kürzen, damit ein
   abgeschnittenes Secret nicht unerkannt stehen bleibt.
"""
from __future__ import annotations

from dataclasses import dataclass

from .classify import SECRET_RULES

TRUNCATION_MARK = "\n[… gekürzt]"


@dataclass(frozen=True)
class CheckedOutput:
    text: str
    redactions: tuple[str, ...]
    truncated: bool

    @property
    def flags(self) -> tuple[str, ...]:
        flags = []
        if self.redactions:
            flags.append("REDACTED")
        if self.truncated:
            flags.append("OUTPUT_TRUNCATED")
        return tuple(flags)


def check_output(text: str, *, max_chars: int) -> CheckedOutput:
    if not isinstance(text, str):
        raise TypeError("INVALID_OUTPUT")
    if type(max_chars) is not int or max_chars < 1:
        raise ValueError("INVALID_LIMIT")
    redactions = []
    for rule_id, pattern in SECRET_RULES:
        text, count = pattern.subn(f"[GESCHWÄRZT:{rule_id}]", text)
        if count:
            redactions.append(rule_id)
    truncated = False
    if len(text) > max_chars:
        text = text[:max_chars] + TRUNCATION_MARK
        truncated = True
    return CheckedOutput(text, tuple(redactions), truncated)
