using MaBibli.Shared.Textes;
namespace MaBibli.Shared.Entites;
///
/// Un livre que l'on aimerait acquérir. Personnel : chacun sa liste.
///
///
/// Pourquoi une entité séparée plutôt qu'un statut de plus sur ?
/// Un livre souhaité n'est pas un livre possédé. S'il était une ligne de Livres, il
/// entrerait mécaniquement dans le catalogue, dans les compteurs, dans les prêts et dans le
/// cache hors-ligne — et il faudrait ajouter « et qui n'est pas souhaité » à chaque
/// lecture du catalogue. Un invariant qu'il faut réécrire à chaque requête finit toujours par
/// être oublié quelque part ; ici l'inventaire et l'envie ne se croisent tout simplement pas,
/// parce qu'ils ne vivent pas dans la même table.
///
/// C'est aussi la seule forme qui accepte une envie sans ISBN ni édition arrêtée : on
/// souhaite une œuvre (« le dernier Werber »), on possède un exemplaire. Un souhait n'a donc
/// ni ni couverture obligatoire, et ne peut pas être prêté.
///
///
/// La portée personnelle suit , dont la documentation annonçait déjà
/// ce voisinage : est une frontière, contrairement à
/// . On ne lit jamais la liste d'envies de quelqu'un d'autre —
/// c'est précisément ce qui permet d'offrir un livre sans vendre la mèche.
///
///
public class LivreSouhaite
{
public int Id { get; set; }
///
/// YNH_USER du propriétaire de l'envie. Frontière : toute lecture filtre dessus.
///
public string Utilisateur { get; set; } = string.Empty;
public string Titre { get; set; } = string.Empty;
///
/// Titre mis à plat, servant à la fois au dédoublonnage et au rapprochement avec le
/// catalogue (« ai-je déjà ce livre ? »). Recalculé à chaque écriture.
///
public string TitreNormalise { get; set; } = string.Empty;
///
/// Auteur en texte libre, volontairement pas une clé étrangère vers .
///
///
/// La table Auteurs décrit qui est dans la bibliothèque : y insérer les auteurs
/// souhaités les ferait apparaître sur l'écran des auteurs avec « 0 livre », et exposerait la
/// liste d'envies d'une personne à tout le foyer — l'inverse de ce qu'on veut. Le texte libre
/// survit en outre à la disparition de l'auteur du catalogue.
///
public string? Auteur { get; set; }
///
/// Auteur mis à plat. Jamais null (chaîne vide si l'auteur est inconnu) :
/// SQLite considère deux NULL comme distincts, et l'index unique laisserait alors
/// passer des doublons d'envies sans auteur.
///
public string AuteurNormalise { get; set; } = string.Empty;
public string? Editeur { get; set; }
/// Année de publication, telle que la source la donne. Texte : la BnF écrit « 2012 », mais aussi « [DL 2012] ».
public string? Annee { get; set; }
/// ISBN d'une édition repérée, quand il y en a une. Facultatif : on souhaite une œuvre, pas forcément une édition.
public string? Isbn { get; set; }
public string? CoverUrl { get; set; }
/// Note libre : « demandé à Noël », « en poche seulement », « chez Untel ».
public string? Note { get; set; }
public DateTime DateAjout { get; set; }
///
/// Rang dans la liste, du plus désiré (0) au moins désiré.
///
///
/// L'ordre est choisi à la main : c'est une préférence, elle ne se calcule pas. Il est
/// personnel comme le reste de la table — le rang n'a de sens qu'à l'intérieur de la
/// liste d'une personne, et deux utilisateurs numérotent la leur indépendamment.
///
/// Une envie nouvelle se pose en fin de liste, jamais en tête : on vient de la noter,
/// on n'a pas dit qu'on la voulait plus que les autres. C'est à l'utilisateur de la remonter.
///
///
public int Rang { get; set; }
public void RecalculerFormes()
{
Titre = Titre.Trim();
TitreNormalise = CleOeuvre.Cle(Titre);
Auteur = string.IsNullOrWhiteSpace(Auteur) ? null : Auteur.Trim();
AuteurNormalise = RapprochementAuteurs.Cle(Auteur);
}
}