"""Routing-Eingänge über das Gateway: Kontextgröße, Qualitätsuntergrenze, Qualität je Aufgabe."""
import unittest

from aria_router.gateway import Handling

from tests.helpers import GatewayTestCase


def candidate(record, backend):
    return next(c for c in record["routing"]["candidates"] if c["backend"] == backend)


class RoutingInputTests(GatewayTestCase):
    def test_context_size_routes_to_claude(self):
        gateway = self.gateway({"backends": {"codex": {"max_context_bytes": 100}}})
        result = gateway.handle(self.request(1, "#public " + "erkläre " * 30))
        self.assertEqual(result.backend, "claude")
        self.assertIn("CONTEXT_TOO_LARGE", candidate(self.decision_records(gateway)[-1], "codex")["reasons"])

    def test_quality_floor_excludes_backends(self):
        gateway = self.gateway({"routing": {"min_quality": 95}})
        blocked = gateway.handle(self.request(2, "#public Frage"))
        self.assertEqual((blocked.handling, blocked.code), (Handling.BLOCKED, "NO_ELIGIBLE_BACKEND"))
        record = self.decision_records(gateway)[-1]
        self.assertIn("QUALITY_BELOW_MINIMUM", candidate(record, "codex")["reasons"])
        better = self.gateway({"routing": {"min_quality": 95}, "backends": {"claude": {"quality": 96}}})
        self.assertEqual(better.handle(self.request(3, "#public Frage")).backend, "claude")

    def test_task_specific_quality(self):
        gateway = self.gateway({"backends": {"codex": {"quality": 80, "task_quality": {"coding": 95}}}})
        self.assertEqual(gateway.handle(self.request(4, "#public Bitte debug mein Python")).backend, "codex")
        self.assertEqual(gateway.handle(self.request(5, "#public Schreib einen kurzen Text")).backend, "claude")
        records = self.decision_records(gateway)
        self.assertEqual([r["task_class"] for r in records[-2:]], ["coding", "writing"])

    def test_capability_vision_only_claude(self):
        gateway = self.gateway()
        from tests.helpers import photo
        result = gateway.handle(self.request(6, "Was ist auf dem Bild?", attachments=[photo()]))
        self.assertEqual(result.backend, "claude")
        record = self.decision_records(gateway)[-1]
        self.assertEqual(record["task_class"], "vision")
        self.assertIn("CAPABILITY_MISSING", candidate(record, "codex")["reasons"])


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