You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

379 lines
13 KiB

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
{
/// <summary>
/// Classe Manager permettant la gestion des Titres de l'application.
/// </summary>
public class Manager : INotifyPropertyChanged
{
/// <summary>
/// Liste de Titre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste
/// </summary>
public ReadOnlyObservableCollection<Titre> ListeTitre { get; private set; }
readonly ObservableCollection<Titre> listeTitre = new ObservableCollection<Titre>();
/// <summary>
/// Liste de CollectionTitre, implementant INotifyCollectionChanged et INotifyPropertyChanged au changement de la liste
/// </summary>
public ReadOnlyObservableCollection<CollectionTitre> ListeCollection { get; private set; }
readonly ObservableCollection<CollectionTitre> listeCollection = new ObservableCollection<CollectionTitre>();
/// <summary>
/// Liste de Titres qui devront etre supprimer lors de la validation de la suppression dans l'application.
/// </summary>
public List<Titre> ListeTitreSupp { get; private set; }
readonly List<Titre> listeTitreSupp = new List<Titre>();
public event PropertyChangedEventHandler PropertyChanged;
/// <summary>
/// Titre Selectionne par l'utilisateur, permettra de modifier, supprimer, ajouter aux favoris, ...
/// </summary>
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"));
}
}
}
/// <summary>
/// Evenement de type IsFavorisEmptyEventArgs permettant de savoir si les Favoris sont vide
/// </summary>
public event EventHandler<IsFavorisEmptyEventArgs> IsFavorisEmpty;
/// <summary>
/// Classe IsFavorisEmptyEventArgs, Heritant de EventArgs
/// </summary>
public class IsFavorisEmptyEventArgs : EventArgs
{
public IsFavorisEmptyEventArgs() { }
}
/// <summary>
/// OnFavorisEmpty est un evenement que l'on a cree permettant de changer la vue de l'application lorsque la liste des Favoris est vide.
/// </summary>
/// <param name="args">Evenement lance lorsque les Favoris sont vide</param>
public void OnFavorisEmpty(IsFavorisEmptyEventArgs args) => IsFavorisEmpty?.Invoke(this, args);
//// Constructeurs de Manager & Persistance
/// <summary>
/// Construit un Manager avec les Titres passe en parametres dans ListeTitre
/// </summary>
/// <param name="desTitres">Liste de Titres a Ajouter au Manager</param>
public Manager(params Titre[] desTitres)
{
ListeTitre = new ReadOnlyObservableCollection<Titre>(listeTitre);
ListeCollection = new ReadOnlyObservableCollection<CollectionTitre>(listeCollection);
ListeTitreSupp = new List<Titre>(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; }
/// <summary>
/// Constructeur de Manager avec la persistance
/// </summary>
/// <param name="pers">Persistance</param>
public Manager(IPersistanceManager pers)
{
ListeTitre = new ReadOnlyObservableCollection<Titre>(listeTitre);
ListeCollection = new ReadOnlyObservableCollection<CollectionTitre>(listeCollection);
ListeTitreSupp = new List<Titre>(listeTitreSupp);
Pers = pers;
this.LoadTitres();
this.LoadTitresFavoris();
}
/// <summary>
/// Charge les Titres Favoris dans ListeCollection
/// </summary>
public void LoadTitresFavoris()
{
// Pour tout les Titres dans la persistance des TitresFavoris, ajouter le titre
foreach (Titre t in Pers.LoadTitresFavoris())
{
GetListeFavoris().AjouterTitreDansCollection(t);
}
}
/// <summary>
/// Enregistre les Titre Favoris dans la persistance
/// </summary>
public void SaveTitresFavoris()
{
Pers.SaveTitresFavoris(GetListeFavoris().ListeTitre);
}
/// <summary>
/// Charge les Titres dans ListeTitre avec la persistance
/// </summary>
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();
}
}
/// <summary>
/// Enregistre les Titres de ListeTitre dans la persistance
/// </summary>
public void SaveTitres()
{
Pers.SaveTitres(ListeTitre);
}
/// <summary>
/// Affiche les Titres de ListeTitre du Manager
/// </summary>
/// <returns>Le string a afficher</returns>
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
/// <summary>
/// Trouve le Titre grace a son Id dans ListeTitre
/// </summary>
/// <param name="uniqueId">L'Id du Titre que l'on veut trouver</param>
/// <returns>Returne le Titre correspondant a l'Id</returns>
public Titre GetTitreById(string uniqueId) => listeTitre.SingleOrDefault(t => t.Id == uniqueId);
/// <summary>
/// Ajoute le Titre passe en parametre dans ListeTitre
/// </summary>
/// <param name="t">Titre a ajouter</param>
/// <returns>True si ca a fonctionne, False si le Titre existe deja</returns>
public bool AjouterTitre(Titre t)
{
if(ContenirTitre(t))
{
Debug.WriteLine("Le titre existe deja");
return false;
}
else
{
listeTitre.Add(t);
return true;
}
}
/// <summary>
/// Verfie si le Titre est contenu dans la ListeTitre
/// </summary>
/// <param name="t">Titre a recherhcer</param>
/// <returns>True si le Titre est dans ListeTitre, sinon False</returns>
public bool ContenirTitre(Titre t)
{
return listeTitre.Contains(t);
}
/// <summary>
/// Supprimer le Titre passe en parametre
/// </summary>
/// <param name="t">Titre a supprimer</param>
/// <returns>True si le Titre est supprime, False sinon</returns>
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;
}
}
/// <summary>
/// Modifie le Titre
/// </summary>
/// <param name="t">Titre a modifier</param>
/// <param name="newT">Titre avec les valeurs a remplacer</param>
/// <returns>True si ca a marche, False sinon</returns>
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
/// <summary>
/// Ajoute une CollectionTitre a ListeCollection
/// </summary>
/// <param name="collection">CollectionTitre a ajouter</param>
/// <returns>True si ca le titre est ajouter, False sinon</returns>
public bool AjouterCollection(CollectionTitre collection)
{
if (ContenirCollection(collection))
{
Debug.WriteLine("Le collection existe deja");
return false;
}
else
{
listeCollection.Add(collection);
return true;
}
}
/// <summary>
/// Supprime la CollectionTitre de ListeCollection
/// </summary>
/// <param name="collection">CollectionTirte a supprimer</param>
/// <returns>True si la colelction est supprimee, False sinon </returns>
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;
}
}
/// <summary>
/// Recherche la Collection dans ListeCollection
/// </summary>
/// <param name="collection">Collection a rechercher</param>
/// <returns>True si la collection est dans ListeCollection, sinon False</returns>
public bool ContenirCollection(CollectionTitre collection)
{
return listeCollection.Contains(collection);
}
/// <summary>
/// Renvoie la collection de Type Favoris dans ListeCollection
/// </summary>
/// <returns>La premiere CollectionTitre de Type Favoris</returns>
public CollectionTitre GetListeFavoris() => listeCollection.FirstOrDefault(c => c is Favoris);
/// <summary>
/// Recherche si le Titre est dans la Collection passe en parametre
/// </summary>
/// <param name="c">CollectionTitre a rechercher</param>
/// <param name="t">Titre a trouver</param>
/// <returns>True si le Titre est dans la CollectionTitre, False sinon</returns>
public bool ContenirTitreInCollection(CollectionTitre c,Titre t)
{
return c.ContenirTitreDansCollection(t);
}
/// <summary>
/// Ajoute le Titre a la CollectionTitre
/// </summary>
/// <param name="c">Collection ou l'on veut ajouter le Titre</param>
/// <param name="t">Titre a ajouter</param>
/// <returns></returns>
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;
}
}
/// <summary>
/// Supprime le Titre de la CollectionTitre passe en parametre
/// </summary>
/// <param name="c">Collection ou l'on veut suppirmer le Titre</param>
/// <param name="t">Titre a supprimer</param>
/// <returns></returns>
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;
}
}
}
}