"""Ehemals AriaOrchestrator (Ausführung ohne Policy). Der Orchestrator ist
entfernt; dieselben Absichten gelten jetzt für Gateway.handle()."""
import unittest

from aria_router.adapters import MockAdapter
from aria_router.gateway import Handling

from tests.helpers import GatewayTestCase


class OrchestratorTests(GatewayTestCase):

    def setUp(self):
        super().setUp()
        self.codex = None
        self.claude = None

    def factories(self, *, with_codex=True):
        def codex(verifier):
            self.codex = MockAdapter(verifier, "codex")
            return self.codex

        def claude(verifier):
            self.claude = MockAdapter(verifier, "claude")
            return self.claude
        return {"codex": codex if with_codex else None, "claude": claude}

    def test_codex_execution(self):
        result = self.gateway(adapter_factories=self.factories()).handle(self.request(1, "#public analyse"))

        self.assertEqual(result.handling, Handling.REPLY)
        self.assertEqual(result.backend, "codex")
        self.assertEqual(self.codex.calls, 1)
        self.assertEqual(self.claude.calls, 0)

    def test_confidential_job_not_executed(self):
        gateway = self.gateway({"privacy": {"claude_status_quo_confidential": False}},
                               adapter_factories=self.factories())
        result = gateway.handle(self.request(2, "Analyse der BMW-Lieferkette"))

        self.assertEqual(result.handling, Handling.BLOCKED)
        self.assertEqual(self.codex.calls, 0)
        self.assertEqual(self.claude.calls, 0)

    def test_missing_adapter(self):
        gateway = self.gateway(adapter_factories=self.factories(with_codex=False))
        result = gateway.handle(self.request(3, "/codex #public analyse"))

        self.assertEqual(result.handling, Handling.BLOCKED)
        self.assertEqual(result.code, "MANUAL_CHOICE_NOT_PERMITTED")
        record = self.log_records(gateway)[-1]
        codex = next(c for c in record["routing"]["candidates"] if c["backend"] == "codex")
        self.assertIn("UNAVAILABLE", codex["reasons"])
        self.assertFalse(record["backend_state"]["codex"]["adapter"])

    def test_claude_execution(self):
        gateway = self.gateway({"backends": {"claude": {"quality": 95}}}, adapter_factories=self.factories())
        result = gateway.handle(self.request(4, "#public analyse"))

        self.assertEqual(result.handling, Handling.REPLY)
        self.assertEqual(result.backend, "claude")
        self.assertEqual(self.claude.calls, 1)


if __name__ == "__main__":
    unittest.main()
