using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics.CodeAnalysis;
using System.ComponentModel;
using System.Runtime.Serialization;
namespace Modele
{
///
/// Classe Titre implementant IEquatable et INotifyPropertyChanged
///
[DataContract] //Permet de dire a la classe qu'elle peut etre serializer
public class Titre : IEquatable, INotifyPropertyChanged
{
///
/// String contenant l'Id du Titre avec un getter et un setter public
///
[DataMember]
public string Id { get; set; }
///
/// String contenant le Nom du Titre avec un getter et un setter public
///
private string nom;
[DataMember]
public string Nom
{
get { return nom; }
set
{
if(nom == value) return;
nom = value;
OnPropertyChanged(nameof(Nom));
}
}
///
/// String contenant le Nom de l'album contenant Titre avec un getter et un setter public
///
private string nomAlbum;
[DataMember]
public string NomAlbum
{
get { return nomAlbum; }
set
{
if(nomAlbum == value) return;
nomAlbum = value;
OnPropertyChanged(nameof (NomAlbum));
}
}
///
/// Video du clip du Titre (la classe Video contient un string Lien) avec un getter et un setter public
///
private Video lienVideo;
[DataMember]
public Video LienVideo
{
get { return lienVideo; }
set
{
if(lienVideo == value) return;
lienVideo = value;
OnPropertyChanged(nameof(LienVideo));
}
}
///
/// Artiste qui a compose le Titre (la classe Artiste contient un string Nom) avec un getter et un setter public
///
private Artiste nomArtiste;
[DataMember]
public Artiste NomArtiste
{
get { return nomArtiste; }
set
{
if(nomArtiste == value) return;
nomArtiste = value;
OnPropertyChanged(nameof(NomArtiste));
}
}
///
/// Chemin de l'Image associe au Titre (la classe Image contient un string Chemin) avec un getter et un setter public
///
private Image cheminImage;
[DataMember]
public Image CheminImage
{
get { return cheminImage; }
set
{
if(cheminImage == value) return;
cheminImage = value;
OnPropertyChanged(nameof(CheminImage));
}
}
///
/// String contenant la Biographie du Titre (Texte disant quelques mots sur la musique) avec un getter et un setter public
///
[DataMember]
public string Bio
{
get { return bio; }
set
{
if(bio == value) return;
bio = value;
OnPropertyChanged(nameof(Bio));
}
}
private string bio;
///
/// Booleen permettant de gerer les favoris dans les vues de l'application (Charge par l'application a chaque lancement) avec un getter et un setter public
///
private bool isFavoris;
[DataMember]
public bool IsFavoris
{
get { return isFavoris; }
set
{
if(isFavoris == value) return;
isFavoris = value;
OnPropertyChanged(nameof(IsFavoris));
}
}
public event PropertyChangedEventHandler PropertyChanged;
///
/// OnPropertyChanged est un evenement permettant de mettre a jour les données quand elles sont modifiées
///
/// Nom de la propriete a mettre a jour
protected virtual void OnPropertyChanged(string propertyName) => PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
///
/// Construit un Titre en prenant que des strings en parametres
///
/// Id du Titre
/// Nom du Titre
/// Nom de l'album du Titre
/// Lien de la video du Titre
/// Nom de l'artiste du Titre
/// Chemin de l'Image du Titre
/// Biographie du Titre
public Titre(string id,string Nom, string NomAlbum,string value, string NomArt, string cheminImage, string Bio )
{
this.Id = id;
if( Id == null)
{
throw new ArgumentNullException();
}
this.Nom = Nom;
this.NomAlbum = NomAlbum;
this.LienVideo = new Video(value);
this.NomArtiste = new Artiste(NomArt);
this.CheminImage = new Image(cheminImage);
this.Bio = Bio;
}
///
/// Construit un Titre en prenant des strings et les classes Video, Artiste et Image en parametre
///
/// Id du Titre
/// Nom du Titre
/// Nom de l'album du Titre
/// Video du Titre (De type Video)
/// Artiste du Titre (De type Artiste)
/// Image du Titre (De type Image)
/// Boigraphie du Titre
public Titre(string id,string Nom, string NomAlbum, Video value, Artiste Art, Image img, string Bio)
{
this.Id=id;
this.Nom = Nom;
this.NomAlbum = NomAlbum;
this.LienVideo = value;
this.NomArtiste = Art;
this.CheminImage = img;
this.Bio = Bio;
}
///
/// Fonction permettant de comparer deux Titres (Autorise un Titre null)
///
/// Titre a comparer
/// True si le Titre est le meme, False sinon
public bool Equals([AllowNull] Titre other)
{
return Id.Equals(other.Id);
}
///
/// Fonction permettant de comparer des objets
///
/// Objet a comparer avec le Titre
/// Renvoie True si le Titre est le meme, sinon renvoie false
public override bool Equals(object obj)
{
if (ReferenceEquals(obj, null)) return false;
if (ReferenceEquals(obj, this)) return true;
if (GetType() != obj.GetType()) return false;
return Equals(obj as Titre);
}
///
/// Transforme un Titre en string (utilise par l'affichage console)
///
/// Un string contenant les informations a afficher pour un Titre
public override string ToString()
{
return $"{Nom} - {NomAlbum} - {NomArtiste} - {LienVideo} - {CheminImage} - {Bio}";
}
///
/// Hache le Titre
///
/// L'id du Titre hache
public override int GetHashCode()
{
return Id.GetHashCode();
}
}
}