using MaBibli.Shared.Entites;
namespace MaBibli.Shared.Catalogue;
///
/// Filtrage, recherche et tri du catalogue.
///
///
/// Écrit sur pour être exécuté par EF Core côté base et
/// testable en mémoire sur une simple liste, sans base ni réseau.
///
/// La comparaison passe par ToLower() : EF Core la traduit en SQL, et LINQ-to-Objects
/// lui donne le même comportement insensible à la casse. Les accents ne sont pas normalisés
/// (« Emile » ne trouve pas « Émile ») — limitation assumée à ce stade.
///
///
public static class FiltreLivres
{
public static IQueryable Appliquer(IQueryable source, CritereLivres criteres)
{
// AUCUN filtre sur AjoutePar : la bibliothèque est commune (CLAUDE.md).
// Ce commentaire est là pour qu'une régression future saute aux yeux en relecture.
if (criteres.Format is { } format)
{
source = source.Where(l => l.Format == format);
}
if (criteres.Statut is { } statut)
{
source = source.Where(l => l.Statut == statut);
}
var terme = criteres.Recherche?.Trim();
if (!string.IsNullOrEmpty(terme))
{
var recherche = terme.ToLower();
source = source.Where(l =>
l.Titre.ToLower().Contains(recherche)
|| (l.Auteur != null && l.Auteur.ToLower().Contains(recherche)));
}
return Trier(source);
}
///
/// Tri par titre, puis par identifiant pour rendre l'ordre déterministe.
///
///
/// CLAUDE.md ne tranche pas le tri. L'ordre alphabétique a été retenu parce qu'une
/// bibliothèque se parcourt par titre ; l'ordre d'ajout n'a d'intérêt que le jour de la saisie.
///
public static IQueryable Trier(IQueryable source) =>
source.OrderBy(l => l.Titre).ThenBy(l => l.Id);
}