"""Adapter-Sammlung.

Der frühere AriaOrchestrator (Ausführung ohne Policy und ohne Digest) ist
entfernt: Der einzige Ausführungspfad ist gateway.Gateway.handle().
MockAdapter ist ein vollwertiger BackendAdapter: Auch er führt nur mit
gültiger HMAC-Clearance aus.
"""
from __future__ import annotations

from typing import Optional

from .adapter_contract import AdapterJob, AdapterResult, BackendAdapter, Outbound, ResultStatus
from .claude_channel import ClaudeChannelAdapter
from .codex_adapter import CodexAdapter


class MockAdapter(BackendAdapter):
    name = "mock"
    accepts_memory = True

    def __init__(self, verifier, name: str, *, output: Optional[str] = None,
                 fail_code: Optional[str] = None, raise_error: bool = False):
        self.name = name
        super().__init__(verifier)
        self.calls = 0
        self.transmitted: list = []
        self._output = output
        self._fail_code = fail_code
        self._raise = raise_error

    def _prepare(self, job: AdapterJob) -> Outbound:
        return Outbound(self.name, {"context": job.envelope.canonical_dict()}, payload=job.envelope)

    def _transmit(self, outbound: Outbound, job: AdapterJob, clearance) -> AdapterResult:
        self.calls += 1
        self.transmitted.append(outbound.transmitted)
        if self._raise:
            raise RuntimeError("Simulated failure")
        if self._fail_code:
            return AdapterResult(job.job_id, self.name, ResultStatus.FAILED, error_code=self._fail_code)
        return AdapterResult(
            job.job_id, self.name, ResultStatus.SUCCESS,
            output=self._output or f"MOCK_RESPONSE backend={self.name} job={job.job_id}",
        )


__all__ = ["MockAdapter", "ClaudeChannelAdapter", "CodexAdapter"]
