from typing import List, Set


class User(object):
    """
    Classe représentant un utilisateur.

    """
    name: str = None
    first_name: str = None
    email: str = None
    password: str = None

    def __init__(self, name, first_name, email, password):
        """
        Initialiser un nouvel utilisateur.

        Args:
            name: nom
            first_name: prénom
            email: email
            password: mot de passe

        """
        self.name = name
        self.first_name = first_name
        self.email = email
        self.password = password

    def __repr__(self):
        """
        Texte affiché pour l'objet quand on le passe dans `print()` ou surtout
        que sa représentation textuelle est demandée.

        Returns:
            Le nom de l'utilisateur.

        """
        return self.name


class Group(object):
    """
    Classe de groupe d'utilisateurs.

    """
    name: str = None
    description: str = None
    # Ici on a un attribut qui est une liste d'objets d'une autre classe.
    # C'est ce qu'on appelle l'agrégation.
    # Si on supprime le groupe, les objets utilisateurs existent toujours indépendamment,
    # on a ici simplement un lien vers des utilisateurs.
    users: Set[User] = None

    def __init__(self, name, description=None):
        """
        Initialiser un nouveau groupe d'utilisateurs.

        Args:
            name: nom du groupe
            description: texte descriptif, facultatif

        """
        self.name = name
        self.description = description

    def __repr__(self):
        """
        Texte affiché pour l'objet quand on le passe dans `print()`

        Returns:
            Le nom du groupe.

        """
        return self.name

    def add_user(self, user: User):
        """
        Ajouter un utilisateur au groupe.

        Args:
            user: instance d'utilisateur à ajouter

        """
        self.users = self.users or set()
        self.users.add(user)

    def get_users(self):
        """
        Renvoie la liste des utilisateurs dans le groupe.

        Returns:
            La liste des utilisateurs ajoutés au groupe.

        """
        return self.users


if __name__ == "__main__":
    # Créer quelques utilisateurs
    user1 = User("Martin", "Jacques", "jmartin@example.com", "jmartin")
    user2 = User("Carletti", "Audrey", "acarletti@example.com", "acarletti")
    user3 = User("Richard", "Luc", "lrichard@example.com", "lrichard")
    user4 = User("Havel", "Vaclav", "vhavel@example.com", "vhavel")
    # Créer un groupe ou deux
    group1 = Group("Amicale des amateurs de froid")
    group2 = Group("Amicale des amateurs de chaud")
    # Ajouter des utilisateurs aux groupes
    group1.add_user(user1)
    group1.add_user(user2)
    group1.add_user(user3)
    group2.add_user(user4)
    # Afficher les utilisateurs pour chaque groupe
    print(f"Utilisateurs du groupe {group1.name} : {group1.get_users()}")
    print(f"Utilisateurs du groupe {group2.name} : {group2.get_users()}")