using MaBibli.Shared.Textes;

namespace MaBibli.Shared.Entites;

/// <summary>
/// Un livre du catalogue. La bibliothèque est <b>commune</b> à tous les utilisateurs.
/// </summary>
public class Livre
{
    public int Id { get; set; }

    /// <summary>ISBN tel que saisi ou scanné (EAN-13 le plus souvent). Peut être absent.</summary>
    public string? Isbn { get; set; }

    public string Titre { get; set; } = string.Empty;

    /// <summary>
    /// Titre en minuscules et sans accents, recalculé à chaque écriture.
    /// </summary>
    /// <remarks>
    /// SQLite ne sait pas comparer sans tenir compte des accents : sans cette colonne,
    /// « Bete » ne trouverait pas « La Bête humaine ».
    /// </remarks>
    public string TitreNormalise { get; set; } = string.Empty;

    public string? Editeur { get; set; }

    public Format Format { get; set; }

    /// <summary>URL de la couverture (OpenLibrary), pas de fichier stocké localement.</summary>
    public string? CoverUrl { get; set; }

    public DateTime DateAjout { get; set; }

    /// <summary>
    /// <c>YNH_USER</c> de la personne qui a saisi le livre.
    /// <b>Traçabilité uniquement : ne JAMAIS filtrer les lectures sur ce champ.</b>
    /// 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.
    /// </summary>
    public string? AjoutePar { get; set; }

    /// <summary>Auteurs du livre, ordonnés par <see cref="LivreAuteur.Position"/>.</summary>
    public List<LivreAuteur> Auteurs { get; set; } = [];

    /// <summary>
    /// Statuts de lecture, <b>un par personne</b> et seulement pour celles qui en ont posé un.
    /// </summary>
    /// <remarks>
    /// ⚠️ Il n'y a volontairement <b>aucune</b> propriété <c>Statut</c> sur cette classe : elle
    /// serait commune à tout le foyer, exactement le défaut que cette table corrige.
    /// </remarks>
    public List<StatutLecture> Statuts { get; set; } = [];

    /// <summary>Historique complet des prêts de ce livre (pas seulement le prêt en cours).</summary>
    public List<Pret> Prets { get; set; } = [];

    public void RecalculerFormes()
    {
        Titre = Titre.Trim();
        TitreNormalise = NormalisationTexte.Normaliser(Titre);
    }
}
