import sys
import unittest
from pathlib import Path

sys.path.insert(0, str(Path(__file__).resolve().parents[1]))

from aria_router.core import (
    Backend, JobRequest, Mode, PrivacyTier, route
)


class RoutingTests(unittest.TestCase):

    def setUp(self):
        self.backends = [
            Backend(
                "codex",
                frozenset({"code", "text"}),
                frozenset({"coding", "writing"})
            ),
            Backend(
                "claude",
                frozenset({"code", "text", "vision"}),
                frozenset({"coding", "writing", "vision"})
            )
        ]

    def test_codex_wins_tie(self):
        job = JobRequest("1", "coding", PrivacyTier.PUBLIC)
        self.assertEqual(route(job, self.backends).backend, "codex")

    def test_claude_for_vision(self):
        job = JobRequest(
            "2", "vision", PrivacyTier.PUBLIC,
            frozenset({"vision"})
        )
        self.assertEqual(route(job, self.backends).backend, "claude")

    def test_confidential_blocked(self):
        job = JobRequest("3", "coding", PrivacyTier.CONFIDENTIAL)
        self.assertFalse(route(job, self.backends).allowed)

    def test_unknown_blocked(self):
        job = JobRequest("4", "coding", PrivacyTier.UNKNOWN)
        self.assertFalse(route(job, self.backends).allowed)

    def test_manual_claude(self):
        job = JobRequest(
            "5", "coding", PrivacyTier.PUBLIC,
            mode=Mode.CLAUDE
        )
        self.assertEqual(route(job, self.backends).backend, "claude")

    def test_budget_block(self):
        blocked = [
            Backend(
                "codex",
                frozenset({"code"}),
                frozenset({"coding"}),
                budget_allowed=False
            )
        ]
        job = JobRequest("6", "coding", PrivacyTier.PUBLIC)
        self.assertFalse(route(job, blocked).allowed)


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