import unittest
from partie import Partie
from joueur import Joueur
from quartier import Noble, Religieux, Commercial, Militaire, Prestige


class TestPartie(unittest.TestCase):
    """Tests pour la classe Partie"""

    def test_initialisation(self):
        """Test l'initialisation d'une partie avec deux joueurs"""
        partie = Partie("Alice", "Bob")
        
        # Vérifier que les joueurs sont créés
        self.assertEqual(len(partie._joueurs), 2)
        self.assertEqual(partie._joueurs[0]._nom, "Alice")
        self.assertEqual(partie._joueurs[1]._nom, "Bob")
        
        # Vérifier que la couronne est attribuée (0 ou 1)
        self.assertIn(partie._est_couronne, [0, 1])
        
        # Vérifier que les personnages sont créés
        self.assertEqual(len(partie._personnages), 8)

    def test_distribuer_quartiers_initiaux(self):
        """Test la distribution initiale des quartiers"""
        partie = Partie("Alice", "Bob")
        
        # Simuler une pioche avec des quartiers
        from quartier import creer_quartiers
        from pioche import Pioche
        partie._quartiers = Pioche(creer_quartiers())
        partie._quartiers.melanger()
        
        # Distribuer les quartiers initiaux
        partie._distribuer_quartiers_initiaux()
        
        # Chaque joueur devrait avoir 4 quartiers
        for joueur in partie._joueurs:
            self.assertEqual(len(joueur._jeu.get_cartes()), 4)

    def test_conditions_arret_aucun_quartier(self):
        """Test conditions_arret quand aucun joueur n'a 8 quartiers"""
        partie = Partie("Alice", "Bob")
        
        # Aucun joueur n'a de quartiers
        result = partie._conditions_arret()
        self.assertFalse(result)

    def test_conditions_arret_un_joueur_gagne(self):
        """Test conditions_arret quand un joueur a 8 quartiers"""
        partie = Partie("Alice", "Bob")
        
        # Alice construit 8 quartiers
        for _ in range(8):
            partie._joueurs[0]._cite.construire(Noble("Test", 1, 1))
        
        result = partie._conditions_arret()
        self.assertTrue(result)

    def test_conditions_arret_deux_joueurs_8_quartiers(self):
        """Test conditions_arret quand les deux joueurs ont 8 quartiers"""
        partie = Partie("Alice", "Bob")
        
        # Les deux joueurs construisent 8 quartiers
        for joueur in partie._joueurs:
            for _ in range(8):
                joueur._cite.construire(Noble("Test", 1, 1))
        
        result = partie._conditions_arret()
        self.assertTrue(result)

    def test_conditions_arret_un_joueur_7_quartiers(self):
        """Test conditions_arret quand un joueur a 7 quartiers (pas encore fini)"""
        partie = Partie("Alice", "Bob")
        
        # Alice construit 7 quartiers
        for _ in range(7):
            partie._joueurs[0]._cite.construire(Noble("Test", 1, 1))
        
        result = partie._conditions_arret()
        self.assertFalse(result)

    def test_lancer_partie_structure(self):
        """Test que la partie ne recrée pas la pioche à chaque tour"""
        partie = Partie("Alice", "Bob")
        
        # Simuler le début de partie
        from quartier import creer_quartiers
        from pioche import Pioche
        partie._quartiers = Pioche(creer_quartiers())
        
        # Sauvegarder l'ID de la pioche initiale
        initial_pioche_id = id(partie._quartiers)
        
        # Distribuer les quartiers initiaux
        partie._distribuer_quartiers_initiaux()
        
        # Vérifier que chaque joueur a 4 quartiers
        for joueur in partie._joueurs:
            self.assertEqual(len(joueur._jeu.get_cartes()), 4)
        
        # Sauvegarder le nombre initial de cartes dans la pioche
        initial_pioche_size = len(partie._quartiers._cartes)
        
        # Vérifier que la pioche existe et a des cartes
        self.assertIsNotNone(partie._quartiers)
        self.assertGreater(initial_pioche_size, 0)
        
        # Vérifier que l'ID de la pioche n'a pas changé
        self.assertEqual(id(partie._quartiers), initial_pioche_id)


if __name__ == '__main__':
    unittest.main(verbosity=2)
