# CorpusFetch Method Slice (Zero-Prose Python Stdlib Reference)
# Canonical Residual: https://corpusfetch.com/c/under-what-conditions-must-an-instance-refuse-to-bridge-an-mcp-tool-call-into-an-a2a-task-when-capability-negotiation-succeeded-but-trust-attestation.md
# Remnant Warrant:    https://corpusfetch.com/c/under-what-conditions-must-an-instance-refuse-to-bridge-an-mcp-tool-call-into-an-a2a-task-when-capability-negotiation-succeeded-but-trust-attestation.warrant.json
# Markdown SHA-256:   3b3a2f6aaee6707a0d3004956b1869cfe263f2c7a2320908be689d9ead27a807
# Code AST SHA-256:   26611f46075ce0e9b93217af4ebae9043fcb757012bae2dee701c04ce5f3f3e7
# Verified Classes:   SideEffect, Attestation, StaleAttestationBridgeError
# Defensive Guards:   2 fail-closed invariants (zero external deps)

import time
from dataclasses import dataclass
from enum import Enum


class SideEffect(Enum):
    READ_ONLY = "read_only"
    MUTATING = "mutating"


@dataclass
class Attestation:
    principal: str
    issued_at: float
    ttl: float

    def age(self, now: float) -> float:
        return now - self.issued_at

    def is_fresh(self, now: float, margin: float) -> bool:
        return self.age(now) + margin <= self.ttl


class StaleAttestationBridgeError(RuntimeError):
    """Raised when a mutating MCP tool call cannot be bridged because the
    downstream A2A attestation is not provably fresh at bridge time and
    synchronous re-attestation is unavailable."""


def bridge_tool_call(
    tool_name: str,
    side_effect: SideEffect,
    attestation: Attestation,
    reattest,
    now: float,
    margin: float = 5.0,
    reattest_budget_s: float = 1.0,
) -> str:
    if side_effect is SideEffect.READ_ONLY:
        return f"bridged read-only {tool_name}"

    if attestation.is_fresh(now, margin):
        return f"bridged mutating {tool_name} under fresh attestation"

    # Attempt synchronous re-attestation before refusing.
    start = time.monotonic()
    refreshed = reattest(attestation.principal)
    elapsed = time.monotonic() - start

    if elapsed > reattest_budget_s or refreshed is None:
        raise StaleAttestationBridgeError(
            f"refusing to bridge mutating tool {tool_name!r}: attestation for "
            f"{attestation.principal!r} is stale (age={attestation.age(now):.1f}s, "
            f"ttl={attestation.ttl:.1f}s, margin={margin:.1f}s) and synchronous "
            f"re-attestation unavailable within {reattest_budget_s:.1f}s"
        )

    if not refreshed.is_fresh(now, margin):
        raise StaleAttestationBridgeError(
            f"refusing to bridge mutating tool {tool_name!r}: re-attestation "
            f"returned a still-stale attestation for {attestation.principal!r}"
        )

    return f"bridged mutating {tool_name} after re-attestation"
