import unittest
from mindscreen import questionnaires as q


class TestPHQ9(unittest.TestCase):
    def test_minimal_severity(self):
        result = q.score_phq9([0] * 9)
        self.assertEqual(result.severity, q.Severity.MINIMAL)
        self.assertEqual(result.raw_score, 0)

    def test_severe_severity(self):
        result = q.score_phq9([3] * 9)
        self.assertEqual(result.severity, q.Severity.SEVERE)
        self.assertEqual(result.raw_score, 27)

    def test_suicide_item_flagged(self):
        responses = [0] * 9
        responses[q.PHQ9_SUICIDE_ITEM_INDEX] = 2
        result = q.score_phq9(responses)
        self.assertIn(q.PHQ9_SUICIDE_ITEM_INDEX, result.flagged_items)

    def test_invalid_length_raises(self):
        with self.assertRaises(ValueError):
            q.score_phq9([0] * 5)

    def test_invalid_value_raises(self):
        with self.assertRaises(ValueError):
            q.score_phq9([5] + [0] * 8)


class TestGAD7(unittest.TestCase):
    def test_moderate_severity(self):
        result = q.score_gad7([2] * 7)  # raw = 14 -> moderate boundary
        self.assertEqual(result.raw_score, 14)
        self.assertEqual(result.severity, q.Severity.MODERATE)


class TestPSS10(unittest.TestCase):
    def test_reverse_scoring(self):
        # All items answered '2' (sometimes). Reverse items become 4-2=2 too,
        # so total should just be 10 * 2 = 20 regardless of reversal.
        result = q.score_pss10([2] * 10)
        self.assertEqual(result.raw_score, 20)
        self.assertEqual(result.severity, q.Severity.MODERATE)

    def test_low_stress(self):
        # Non-reverse items at 0 (never upset), reverse items at 4 (very
        # often confident/on top of things) => low perceived stress overall.
        responses = [0] * 10
        for i in q.PSS10_REVERSE_INDICES:
            responses[i] = 4
        result = q.score_pss10(responses)
        self.assertEqual(result.raw_score, 0)
        self.assertEqual(result.severity, q.Severity.LOW)


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