using MaBibli.Shared.Textes;
namespace MaBibli.Shared.Entites;
///
/// Un livre du catalogue. La bibliothèque est commune à tous les utilisateurs.
///
public class Livre
{
public int Id { get; set; }
/// ISBN tel que saisi ou scanné (EAN-13 le plus souvent). Peut être absent.
public string? Isbn { get; set; }
public string Titre { get; set; } = string.Empty;
///
/// Titre en minuscules et sans accents, recalculé à chaque écriture.
///
///
/// SQLite ne sait pas comparer sans tenir compte des accents : sans cette colonne,
/// « Bete » ne trouverait pas « La Bête humaine ».
///
public string TitreNormalise { get; set; } = string.Empty;
public string? Editeur { get; set; }
public Format Format { get; set; }
///
/// Roman, bande dessinée… Indépendant du format : une BD numérique existe.
///
///
/// Par défaut , qui ne veut pas dire « roman » : voir
/// l'énumération. L'interface n'affiche donc une étiquette que lorsque le type a été
/// choisi, comme elle n'affiche le format que pour les ebooks.
///
public TypeDocument TypeDocument { get; set; }
///
/// Nombre de pages, facultatif.
///
///
/// ⚠️ null et non 0 : aucun livre déjà catalogué ne porte cette information,
/// et « 0 page » se lirait comme une donnée alors que c'est une absence. Même famille de
/// piège que , dont le défaut ne prétend rien.
///
/// Il peut être proposé par la BnF (dc:format : « 1 vol. (349 p.) »), mais il reste
/// modifiable et n'est jamais imposé. Rien n'est déduit pour un ebook, dont la
/// pagination dépend de la police.
///
///
public int? NombrePages { get; set; }
/// URL de la couverture (OpenLibrary), pas de fichier stocké localement.
public string? CoverUrl { get; set; }
/// URL de la notice bibliographique qui a servi à préremplir la fiche.
public string? UrlNotice { get; set; }
public DateTime DateAjout { get; set; }
///
/// YNH_USER de la personne qui a saisi le livre.
/// Traçabilité uniquement : ne JAMAIS filtrer les lectures sur ce champ.
/// La bibliothèque est commune ; ce champ existe pour savoir qui a ajouté quoi,
/// et pour permettre un cloisonnement ultérieur sans migration de schéma.
///
public string? AjoutePar { get; set; }
/// Auteurs du livre, ordonnés par .
public List Auteurs { get; set; } = [];
///
/// Thèmes du livre. Ils décrivent l'œuvre et sont donc communs au foyer, contrairement aux
/// statuts de lecture et aux envies.
///
public List Themes { get; set; } = [];
///
/// Statuts de lecture, un par personne et seulement pour celles qui en ont posé un.
///
///
/// ⚠️ Il n'y a volontairement aucune propriété Statut sur cette classe : elle
/// serait commune à tout le foyer, exactement le défaut que cette table corrige.
///
public List Statuts { get; set; } = [];
/// Historique complet des prêts de ce livre (pas seulement le prêt en cours).
public List Prets { get; set; } = [];
public void RecalculerFormes()
{
Titre = Titre.Trim();
TitreNormalise = NormalisationTexte.Normaliser(Titre);
}
}