#!/usr/bin/env python3
"""Tests pour CORRECTION 3 : budget presse augmente a 8000."""
import sys
import os
import unittest

sys.path.insert(0, os.path.dirname(__file__))


class TestCapPressBudget(unittest.TestCase):
    """Tests pour _cap_press_budget avec le nouveau budget."""

    def setUp(self):
        from server import _cap_press_budget, PRESS_TEXT_BUDGET
        self.cap = _cap_press_budget
        self.budget = PRESS_TEXT_BUDGET

    def test_budget_is_8000(self):
        from server import PRESS_TEXT_BUDGET
        self.assertEqual(PRESS_TEXT_BUDGET, 8000)

    def test_wikipedia_not_affected(self):
        sources = [
            {"domain": "wikipedia.org", "text": "W" * 5000},
            {"domain": "lemonde.fr", "text": "A" * 2000},
        ]
        result = self.cap(sources)
        wiki = [s for s in result if s["domain"] == "wikipedia.org"]
        self.assertEqual(len(wiki[0]["text"]), 5000)

    def test_total_budget_respected(self):
        sources = [
            {"domain": f"site{i}.fr", "text": "X" * 3000}
            for i in range(6)
        ]
        result = self.cap(sources)
        total_press = sum(
            len(s["text"]) for s in result
            if s["domain"] != "wikipedia.org")
        self.assertLessEqual(total_press, 8000)

    def test_rich_sources_get_more(self):
        """Sources riches recoivent plus que les pauvres."""
        sources = [
            {"domain": "site1.fr", "text": "R" * 5000},  # riche
            {"domain": "site2.fr", "text": "P" * 100},    # pauvre
        ]
        result = self.cap(sources)
        rich = [s for s in result if s["domain"] == "site1.fr"][0]
        poor = [s for s in result if s["domain"] == "site2.fr"][0]
        self.assertGreater(len(rich["text"]), len(poor["text"]))

    def test_max_per_source_3000(self):
        """Chaque source presse est limitee a 3000 chars."""
        sources = [
            {"domain": "site1.fr", "text": "X" * 8000},
        ]
        result = self.cap(sources)
        self.assertLessEqual(len(result[0]["text"]), 3000)

    def test_six_varied_sources(self):
        """6 sources de longueurs variees."""
        sources = [
            {"domain": "a.fr", "text": "A" * 100},
            {"domain": "b.fr", "text": "B" * 500},
            {"domain": "c.fr", "text": "C" * 2000},
            {"domain": "d.fr", "text": "D" * 3000},
            {"domain": "e.fr", "text": "E" * 5000},
            {"domain": "f.fr", "text": "F" * 8000},
        ]
        result = self.cap(sources)
        total = sum(len(s["text"]) for s in result)
        self.assertLessEqual(total, 8000)
        # Les sources les plus riches sont presentes
        self.assertGreaterEqual(len(result), 3)


class TestSynthesizerBudgets(unittest.TestCase):
    """Tests pour les budgets du synthesizer."""

    def test_max_user_chars_12000(self):
        from synthesizer import GeoSynthesizer
        s = GeoSynthesizer()
        self.assertEqual(s.MAX_USER_CHARS, 12000)

    def test_max_source_chars_3000(self):
        from synthesizer import GeoSynthesizer
        s = GeoSynthesizer()
        self.assertEqual(s.MAX_SOURCE_CHARS, 3000)


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