using MaBibli.Shared.Textes;
namespace MaBibli.Shared.Entites;
///
/// Un auteur du catalogue. Table dédiée, et non plus un champ texte sur .
///
///
/// Deux besoins imposaient la table : regrouper les livres d'un même auteur d'un clic, et
/// retrouver « Émile » en tapant « Emile ». Un champ texte libre ne sait faire ni l'un ni l'autre.
///
public class Auteur
{
public int Id { get; set; }
/// Nom tel qu'affiché, accents et casse compris : « Émile Zola ».
public string Nom { get; set; } = string.Empty;
///
/// Forme normalisée du nom (minuscules, sans accents), dans l'ordre de saisie.
/// Sert à la recherche.
///
public string NomNormalise { get; set; } = string.Empty;
///
/// Clé de regroupement : mêmes mots normalisés mais triés, ce qui rend l'ordre
/// indifférent. Unique en base : c'est elle qui empêche « Zola, Émile » et
/// « Émile Zola » de coexister.
///
public string CleRegroupement { get; set; } = string.Empty;
public List Livres { get; set; } = [];
/// Renseigne les deux formes dérivées à partir du nom d'affichage.
public void RecalculerFormes()
{
Nom = Nom.Trim();
NomNormalise = NormalisationTexte.Normaliser(Nom);
CleRegroupement = RapprochementAuteurs.Cle(Nom);
}
}
///
/// Table de liaison livre ↔ auteur : un livre peut avoir plusieurs auteurs.
///
///
/// Le cas n'est pas théorique : le lookup ISBN d'Introduction to Algorithms renvoie
/// quatre noms (Cormen, Leiserson, Rivest, Stein). conserve l'ordre de
/// la couverture, qui n'est pas alphabétique et fait partie de l'information.
///
public class LivreAuteur
{
public int LivreId { get; set; }
public Livre? Livre { get; set; }
public int AuteurId { get; set; }
public Auteur? Auteur { get; set; }
/// Rang de l'auteur sur la couverture, à partir de 0.
public int Position { get; set; }
///
/// Rôle sur ce livre : scénario, dessin, couleurs. Voir .
///
///
/// Il est porté par le lien et non par l'auteur : le même dessinateur peut avoir scénarisé
/// un autre album, et il ne doit pas pour autant exister en deux fiches.
///
public RoleAuteur Role { get; set; }
}
///
/// Rapprochement d'auteurs explicitement refusé par l'utilisateur.
///
///
/// Sans cette mémoire, une suggestion écartée reviendrait à chaque affichage : « Hamilton » et
/// « Peter F. Hamilton » se ressembleront toujours autant. On ne stocke que les refus ;
/// les suggestions elles-mêmes sont recalculées à la demande, et une acceptation ne laisse rien
/// à mémoriser puisque l'un des deux auteurs disparaît.
///
/// Le couple est toujours rangé avec le plus petit identifiant en premier, pour qu'un refus vaille
/// dans les deux sens.
///
///
public class RapprochementRefuse
{
public int Id { get; set; }
public int AuteurAId { get; set; }
public int AuteurBId { get; set; }
}