"""Garante que secrets encontrados nunca aparecem em texto puro em logs,
issues ou saída de terminal — só os últimos caracteres ficam visíveis."""


def redact(secret: str, visible_chars: int = 4) -> str:
    """Mascara um secret, mantendo só os últimos N caracteres visíveis.

    Exemplo: redact("ghp_aBcD1234efGH5678") -> "••••••••••••••••5678"
    """
    if not secret:
        return ""

    if len(secret) <= visible_chars:
        return "•" * len(secret)

    masked_len = len(secret) - visible_chars
    return ("•" * masked_len) + secret[-visible_chars:]


def redact_line(line: str, secret: str, visible_chars: int = 4) -> str:
    """Substitui a ocorrência do secret dentro de uma linha de código/log
    pela versão mascarada, preservando o resto do contexto da linha."""
    if secret not in line:
        return line
    return line.replace(secret, redact(secret, visible_chars))