using System.Collections.ObjectModel; using System.Diagnostics.CodeAnalysis; namespace Model { /// /// Classe responsable de la gestion des jeux et des utilisateurs. /// public class Manager { /// /// Le type de persistance utilisé par le gestionnaire. /// public readonly IPersistance mgrpersistance; /// /// La liste des jeux disponibles. /// public ReadOnlyCollection GameList => gameList.AsReadOnly(); private readonly List gameList; /// /// Le jeu sélectionné actuellement. /// public Game? SelectedGame { get; set; } /// /// L'utilisateur actuellement connecté. /// public User? CurrentUser { get; set; } /// /// La liste des utilisateurs enregistrés. /// public HashSet Users { get; private set; } /// /// Initialise une nouvelle instance de la classe avec un objet de persistance spécifié. /// /// Le type de persistance utilisé pour charger/sauvegarder les jeux et les utilisateurs. public Manager(IPersistance persistance) { mgrpersistance = persistance; gameList = persistance.LoadGame(); Users = persistance.LoadUser(); } /// /// Filtre les jeux en fonction des critères de filtrage donnés. /// /// Nom du jeu à filtrer. /// Première étiquette à filtrer. /// Deuxième étiquette à filtrer. /// Une liste de jeux filtrée. public IEnumerable FilterGames(string? filterName, string? filterTag1, string? filterTag2) { IEnumerable retList; retList = gameList; if (filterName != null) retList = retList .Where(game => game.Name.Contains(filterName, StringComparison.OrdinalIgnoreCase) ); if (filterTag1 != null) retList = retList .Where(game => game.Tags != null && game.Tags.Any(tag => tag != null && tag.Contains(filterTag1, StringComparison.OrdinalIgnoreCase)) ); if (filterTag2 != null) retList = retList .Where(game => game.Tags != null && game.Tags.Any(tag => tag != null && tag.Contains(filterTag2, StringComparison.OrdinalIgnoreCase)) ); return retList; } /// /// Ajoute un jeu à la liste des jeux. /// /// Le jeu à ajouter. public void AddGametoGamesList(Game game) { if (!gameList.Contains(game)) gameList.Add(game); mgrpersistance.SaveGame(gameList); } /// /// Ajoute un utilisateur à la liste des utilisateurs. /// /// L'utilisateur à ajouter. public void AddUsertoUserList(User user) { if (!Users.Contains(user)) Users.Add(user); mgrpersistance.SaveUser(Users); } /// /// Supprime un jeu de la liste des jeux. /// /// Le jeu à supprimer. public void RemoveGameFromGamesList(Game game) { SelectedGame = null; gameList.Remove(game); mgrpersistance.SaveGame(gameList); } /// /// Sauvegarde les jeux. /// [ExcludeFromCodeCoverage] public void SaveGames() { mgrpersistance.SaveGame(gameList); } /// /// Recherche un utilisateur par son nom d'utilisateur. /// /// Le nom d'utilisateur à rechercher. /// L'utilisateur correspondant, ou null s'il n'est pas trouvé. public User? SearchUser(string username) { foreach (User user in Users) { if (user.Username == username) return user; } return null; } /// /// Sauvegarde les utilisateurs. /// [ExcludeFromCodeCoverage] public void SaveUser() { mgrpersistance.SaveUser(Users); } /// /// Met à jour les références des jeux suivis par l'utilisateur actuel. /// [ExcludeFromCodeCoverage] public void UpdateReferences() { if (CurrentUser != null && CurrentUser.Followed_Games.Count != 0) { foreach (var game in CurrentUser.Followed_Games.ToList()) { CurrentUser.RemoveAGame(game); if (GameList.Contains(game)) CurrentUser.FollowAGame(gameList.Where(g => g.Name == game.Name).First()); } } SaveUser(); } } }