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