using MaBibli.Shared.Entites;

namespace MaBibli.Shared.Catalogue;

/// <summary>
/// Critères de consultation du catalogue.
/// </summary>
/// <remarks>
/// <b>Il n'existe volontairement aucun critère sur <c>AjoutePar</c>.</b> La bibliothèque est
/// commune à tout le foyer : filtrer les lectures sur ce champ serait un bug de conception.
/// L'absence de ce critère est l'endroit où l'invariant est le plus visible.
/// <para>
/// <see cref="Statut"/> n'est pas une exception : il filtre sur le statut de <b>l'appelant</b>,
/// que le serveur connaît par les en-têtes SSOwat. Le client ne désigne jamais de qui il parle.
/// </para>
/// </remarks>
public record CritereLivres
{
    /// <summary>
    /// Texte cherché dans le titre <i>ou</i> les auteurs. Insensible à la casse
    /// <b>et aux accents</b> : « emile » trouve « Émile ».
    /// </summary>
    public string? Recherche { get; init; }

    /// <summary>Physique ou numérique. <c>null</c> = les deux : le catalogue est unique.</summary>
    public Format? Format { get; init; }

    /// <summary>
    /// Statut de lecture de l'utilisateur courant. <c>null</c> = tous.
    /// </summary>
    /// <remarks>
    /// Un livre sans statut pour cette personne ne remonte sous <b>aucune</b> valeur : « non
    /// commencé » n'est pas un statut, c'est l'absence de statut. Il reste visible sans filtre.
    /// </remarks>
    public Statut? Statut { get; init; }

    /// <summary>Ne garder que les livres d'un auteur — le « cliquer sur un auteur » d'IDEES.md.</summary>
    public int? AuteurId { get; init; }
}
