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, PrivacyTier, Mode, route
)


class QualityTests(unittest.TestCase):

    def setUp(self):
        self.backends = [
            Backend(
                "codex",
                frozenset({"text"}),
                frozenset({"analysis"}),
                quality_score=80
            ),
            Backend(
                "claude",
                frozenset({"text"}),
                frozenset({"analysis"}),
                quality_score=90
            )
        ]

    def test_claude_quality_advantage(self):
        job = JobRequest("q1", "analysis", PrivacyTier.PUBLIC)
        self.assertEqual(
            route(job, self.backends).backend, "claude"
        )

    def test_codex_tie_breaker(self):
        equal = [
            Backend(
                "codex", frozenset({"text"}),
                frozenset({"analysis"}), quality_score=90
            ),
            Backend(
                "claude", frozenset({"text"}),
                frozenset({"analysis"}), quality_score=90
            )
        ]
        job = JobRequest("q2", "analysis", PrivacyTier.PUBLIC)
        self.assertEqual(route(job, equal).backend, "codex")

    def test_manual_codex(self):
        job = JobRequest(
            "q3", "analysis", PrivacyTier.PUBLIC,
            mode=Mode.CODEX
        )
        self.assertEqual(
            route(job, self.backends).backend, "codex"
        )

    def test_privacy_overrides_manual(self):
        job = JobRequest(
            "q4", "analysis", PrivacyTier.CONFIDENTIAL,
            mode=Mode.CLAUDE
        )
        self.assertFalse(route(job, self.backends).allowed)

    def test_unavailable_claude(self):
        unavailable = [
            self.backends[0],
            Backend(
                "claude", frozenset({"text"}),
                frozenset({"analysis"}),
                available=False,
                quality_score=90
            )
        ]
        job = JobRequest("q5", "analysis", PrivacyTier.PUBLIC)
        self.assertEqual(
            route(job, unavailable).backend, "codex"
        )


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