using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Collections.ObjectModel;
using System.Diagnostics;
using System.ComponentModel;
namespace Modele
{
///
/// Classe Manager permettant la gestion des Titres de l'application.
///
public class Manager : INotifyPropertyChanged
{
///
/// Liste de Titre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste
///
public ReadOnlyObservableCollection ListeTitre { get; private set; }
readonly ObservableCollection listeTitre = new ObservableCollection();
///
/// Liste de CollectionTitre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste
///
public ReadOnlyObservableCollection ListeCollection { get; private set; }
readonly ObservableCollection listeCollection = new ObservableCollection();
///
/// Liste de Titres qui devront etre supprimer lors de la validation de la suppression dans l'application.
///
public List ListeTitreSupp { get; private set; }
readonly List listeTitreSupp = new List();
public event PropertyChangedEventHandler PropertyChanged;
///
/// Titre Selectionne par l'utilisateur, permettra de modifier, supprimer, ajouter aux favoris, ...
///
private Titre selectedTitre;
public Titre SelectedTitre
{
get { return selectedTitre; }
set
{
if (selectedTitre == value)
{
return;
}
selectedTitre = value;
//PropertyChanged?.Invoke(this, new PropertyChangedEventArgs("SelectedTitre"));
if(PropertyChanged != null)
{
PropertyChanged(this, new PropertyChangedEventArgs("SelectedTitre"));
}
}
}
///
/// Evenement de type IsFavorisEmptyEventArgs permettant de savoir si les Favoris sont vide
///
public event EventHandler IsFavorisEmpty;
///
/// Classe IsFavorisEmptyEventArgs, Heritant de EventArgs
///
public class IsFavorisEmptyEventArgs : EventArgs
{
public IsFavorisEmptyEventArgs() { }
}
///
/// OnFavorisEmpty est un evenement que l'on a cree permettant de changer la vue de l'application lorsque la liste des Favoris est vide.
///
/// Evenement lance lorsque les Favoris sont vide
public void OnFavorisEmpty(IsFavorisEmptyEventArgs args) => IsFavorisEmpty?.Invoke(this, args);
//// Constructeurs de Manager & Persistance
///
/// Construit un Manager avec les Titres passe en parametres dans ListeTitre
///
/// Liste de Titres a Ajouter au Manager
public Manager(params Titre[] desTitres)
{
ListeTitre = new ReadOnlyObservableCollection(listeTitre);
ListeCollection = new ReadOnlyObservableCollection(listeCollection);
ListeTitreSupp = new List(listeTitreSupp);
//listeTitre.AddRange(desTitres.Where(t => t != null && listeTitre.Contains(t)));
foreach (Titre titre in desTitres)
{
listeTitre.Add(titre);
}
if (!listeCollection.Any())
{
listeCollection.Add(new Favoris());
}
}
public IPersistanceManager Pers { get; private set; }
///
/// Constructeur de Manager avec la persistance
///
/// Persistance
public Manager(IPersistanceManager pers)
{
ListeTitre = new ReadOnlyObservableCollection(listeTitre);
ListeCollection = new ReadOnlyObservableCollection(listeCollection);
ListeTitreSupp = new List(listeTitreSupp);
Pers = pers;
this.LoadTitres();
this.LoadTitresFavoris();
}
///
/// Charge les Titres Favoris dans ListeCollection
///
public void LoadTitresFavoris()
{
// Pour tout les Titres dans la persistance des TitresFavoris, ajouter le titre
foreach (Titre t in Pers.LoadTitresFavoris())
{
GetListeFavoris().AjouterTitreDansCollection(t);
}
}
///
/// Enregistre les Titre Favoris dans la persistance
///
public void SaveTitresFavoris()
{
Pers.SaveTitresFavoris(GetListeFavoris().ListeTitre);
}
///
/// Charge les Titres dans ListeTitre avec la persistance
///
public void LoadTitres()
{
listeTitre.Clear();
foreach (Titre titre in Pers.LoadTitres())
{
listeTitre.Add(titre);
}
if (! listeCollection.Any())
{
listeCollection.Add(new Favoris());
}
if (listeTitre.Count > 0)
{
SelectedTitre = listeTitre.First();
}
}
///
/// Enregistre les Titres de ListeTitre dans la persistance
///
public void SaveTitres()
{
Pers.SaveTitres(ListeTitre);
}
///
/// Affiche les Titres de ListeTitre du Manager
///
/// Le string a afficher
public override string ToString()
{
StringBuilder sb = new StringBuilder("Mes Titres : ");
foreach (Titre t in listeTitre)
{
sb.Append($"{t}\t");
}
return sb.ToString();
}
////Methodes de Manager pour les Titres
///
/// Trouve le Titre grace a son Id dans ListeTitre
///
/// L'Id du Titre que l'on veut trouver
/// Returne le Titre correspondant a l'Id
public Titre GetTitreById(string uniqueId) => listeTitre.SingleOrDefault(t => t.Id == uniqueId);
///
/// Ajoute le Titre passe en parametre dans ListeTitre
///
/// Titre a ajouter
/// True si ca a fonctionne, False si le Titre existe deja
public bool AjouterTitre(Titre t)
{
if(ContenirTitre(t))
{
Debug.WriteLine("Le titre existe deja");
return false;
}
else
{
listeTitre.Add(t);
return true;
}
}
///
/// Verfie si le Titre est contenu dans la ListeTitre
///
/// Titre a recherhcer
/// True si le Titre est dans ListeTitre, sinon False
public bool ContenirTitre(Titre t)
{
return listeTitre.Contains(t);
}
///
/// Supprimer le Titre passe en parametre
///
/// Titre a supprimer
/// True si le Titre est supprime, False sinon
public bool SupprimerTitre(Titre t)
{
if(ContenirTitre(t))
{
foreach (var c in listeCollection.Where(c => c.ContenirTitreDansCollection(t)))
{
c.SupprimerTitreDeCollection(t);
}
listeTitre.Remove(t);
return true;
}
else
{
Debug.WriteLine("Le titre n'existe pas");
return false;
}
}
///
/// Modifie le Titre
///
/// Titre a modifier
/// Titre avec les valeurs a remplacer
/// True si ca a marche, False sinon
public bool ModifierTitre(Titre t,Titre newT)
{
if(!ContenirTitre(t))
{
Debug.WriteLine("Le titre n'existe pas");
return false;
}
else
{
t.Id = newT.Id;
t.Nom = newT.Nom;
t.NomAlbum = newT.NomAlbum;
t.LienVideo = newT.LienVideo;
t.NomArtiste = newT.NomArtiste;
t.CheminImage = newT.CheminImage;
t.Bio = newT.Bio;
Debug.WriteLine("Titre modifier");
return t==newT;
}
}
////Methode de Manager pour les Collections
///
/// Ajoute une CollectionTitre a ListeCollection
///
/// CollectionTitre a ajouter
/// True si ca le titre est ajouter, False sinon
public bool AjouterCollection(CollectionTitre collection)
{
if (ContenirCollection(collection))
{
Debug.WriteLine("Le collection existe deja");
return false;
}
else
{
listeCollection.Add(collection);
return true;
}
}
///
/// Supprime la CollectionTitre de ListeCollection
///
/// CollectionTirte a supprimer
/// True si la colelction est supprimee, False sinon
public bool SupprimerCollection(CollectionTitre collection)
{
if (!ContenirCollection(collection))
{
Debug.WriteLine("La collection existe pas");
return false;
}
if(collection is Favoris)
{
Debug.WriteLine("La collection est Favori");
return false;
}
else
{
listeCollection.Remove(collection);
return true;
}
}
///
/// Recherche la Collection dans ListeCollection
///
/// Collection a rechercher
/// True si la collection est dans ListeCollection, sinon False
public bool ContenirCollection(CollectionTitre collection)
{
return listeCollection.Contains(collection);
}
///
/// Renvoie la collection de Type Favoris dans ListeCollection
///
/// La premiere CollectionTitre de Type Favoris
public CollectionTitre GetListeFavoris() => listeCollection.FirstOrDefault(c => c is Favoris);
///
/// Recherche si le Titre est dans la Collection passe en parametre
///
/// CollectionTitre a rechercher
/// Titre a trouver
/// True si le Titre est dans la CollectionTitre, False sinon
public bool ContenirTitreInCollection(CollectionTitre c,Titre t)
{
return c.ContenirTitreDansCollection(t);
}
///
/// Ajoute le Titre a la CollectionTitre
///
/// Collection ou l'on veut ajouter le Titre
/// Titre a ajouter
///
public bool AjouterTitreToCollection(CollectionTitre c, Titre t)
{
if (ContenirTitreInCollection(c,t))
{
Debug.WriteLine("Le titre existe deja");
return false;
}
else
{
c.AjouterTitreDansCollection(t);
return true;
}
}
///
/// Supprime le Titre de la CollectionTitre passe en parametre
///
/// Collection ou l'on veut suppirmer le Titre
/// Titre a supprimer
///
public bool SupprimerTitreFromCollection(CollectionTitre c, Titre t)
{
if (!ContenirTitreInCollection(c, t))
{
Debug.WriteLine("Le Titre n'est pas dans la collection");
return false;
}
else
{
c.SupprimerTitreDeCollection(t);
return true;
}
}
}
}