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();
}
}
}