using System.Collections.ObjectModel; using System.ComponentModel; using System.Runtime.CompilerServices; using System.Runtime.Serialization; using System.Text; namespace Model { /// /// Représente un jeu. /// [DataContract] public sealed class Game : INotifyPropertyChanged, IEquatable { [DataMember] /// /// Obtient ou définit le nom du jeu. /// public string Name { get => name; private set { if (string.IsNullOrWhiteSpace(value)) name = "Default"; else name = value; NotifyPropertyChanged(); } } private string name = default!; [DataMember] /// /// Obtient ou définit la description du jeu. /// public string Description { get => description; private set { if (string.IsNullOrWhiteSpace(value)) description = "Defaut"; else description = value; NotifyPropertyChanged(); } } private string description = default!; [DataMember] /// /// Obtient ou définit l'année de sortie du jeu. /// public int Year { get => year; private set { if (value < 1957 || value > 2023) year = 2023; else year = value; NotifyPropertyChanged(); } } private int year = default!; [DataMember] /// /// Obtient ou définit la couverture du jeu. /// public string Cover { get => cover; private set { if (string.IsNullOrWhiteSpace(value)) cover = "no_cover.png"; else cover = value; NotifyPropertyChanged(); } } private string cover = default!; /// /// Obtient les étiquettes du jeu. /// public ReadOnlyCollection Tags { get => tags.AsReadOnly(); private set { if (value == null || value.Count > 3) tags = new List(); else tags = value.ToList(); NotifyPropertyChanged(); } } [DataMember] private List tags; /// /// Obtient les avis sur le jeu. /// public ReadOnlyCollection Reviews => reviews.AsReadOnly(); [DataMember] private readonly List reviews; /// /// Obtient la note moyenne du jeu. /// public double Average => Reviews.Any() ? Math.Round(Reviews.Select(review => review.Rate).Average(), 1) : 0; [DataMember] /// /// Obtient ou définit le lien du jeu. /// public string Lien { get => lien; private set { if (string.IsNullOrWhiteSpace(value)) lien = "Pas de lien"; else lien = value; NotifyPropertyChanged(); } } private string lien = default!; /// /// Initialise une nouvelle instance de la classe avec les valeurs spécifiées. /// /// Le nom du jeu. /// La description du jeu. /// L'année de sortie du jeu. /// Les étiquettes du jeu. /// La couverture du jeu. /// Le lien du jeu. public Game(string name, string description, int year, List c_tags, string cover, string c_lien) { if (string.IsNullOrWhiteSpace(name)) Name = "Default"; else Name = name; if (string.IsNullOrWhiteSpace(description)) Description = "Pas de description"; else Description = description; Year = year; if (c_tags is not null) tags = new List(c_tags); else tags = new List(); if (string.IsNullOrWhiteSpace(cover)) Cover = "no_cover.png"; else Cover = cover; if (string.IsNullOrWhiteSpace(c_lien)) Lien = "Pas de lien"; else Lien = c_lien; reviews = new List(); } /// /// Événement déclenché lorsque la valeur d'une propriété change. /// public event PropertyChangedEventHandler? PropertyChanged; private void NotifyPropertyChanged([CallerMemberName] string propertyName = "") => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); /// /// Retourne le code de hachage pour l'objet. /// /// Le code de hachage calculé. public override int GetHashCode() { if (string.IsNullOrWhiteSpace(Name)) return 0; return Name.GetHashCode(); } /// /// Détermine si l'objet spécifié est égal à l'objet actuel. /// /// L'objet à comparer avec l'objet actuel. /// True si les objets sont égaux, sinon False. public override bool Equals(object? obj) { if (object.ReferenceEquals(obj, null)) return false; if (object.ReferenceEquals(this, obj)) return true; if (this.GetType() != obj.GetType()) return false; return this.Equals(obj as Game); } /// /// Détermine si l'objet spécifié est égal à l'objet actuel. /// /// L'objet à comparer avec l'objet actuel. /// True si les objets sont égaux, sinon False. public bool Equals(Game? other) { if (string.IsNullOrWhiteSpace(Name)) return false; return other != null && Name.Equals(other.Name); } /// /// Retourne une chaîne qui représente l'objet courant. /// /// Une chaîne qui représente l'objet courant. public override string ToString() { StringBuilder builder = new(); builder.Append($"{Name} : {Description} : {Year} : {Cover} : {lien}\n"); foreach (Review review in Reviews) { builder.Append($"{review}\n"); } return builder.ToString(); } /// /// Ajoute un avis sur le jeu. /// /// L'avis à ajouter. public void AddReview(Review review) { reviews.Add(review); UpdateReviews(); } /// /// Supprime un avis du jeu. /// /// L'avis à supprimer. public void RemoveReview(Review review) { reviews.Remove(review); UpdateReviews(); } /// /// Met à jour la liste des avis et la note moyenne. /// public void UpdateReviews() { NotifyPropertyChanged(nameof(Reviews)); NotifyPropertyChanged(nameof(Average)); } /// /// Modifie la description du jeu. /// /// La nouvelle description. public void DescChange(string newdesc) { description = newdesc; } /// /// Modifie les étiquettes du jeu. /// /// La nouvelle liste d'étiquettes. public void TagChange(List newtag) { if (newtag != null && newtag.Count <= 3) tags = new List(newtag); } /// /// Modifie le nom du jeu. /// /// Le nouveau nom. public void NameChange(string newname) { name = newname; } /// /// Modifie l'année de sortie du jeu. /// /// La nouvelle année. public void YearChange(int newyear) { year = newyear; } } }