using MaBibli.Shared.Textes;

namespace MaBibli.Shared.Entites;

/// <summary>
/// Un article annoncé <b>à la une</b> d'un numéro de revue.
/// </summary>
/// <remarks>
/// <b>Sur le NUMÉRO, jamais sur la revue</b> (tranché avec l'utilisateur le 2026-08-20) : les
/// articles à la une changent à chaque parution. Posés sur <see cref="Revue"/>, ils décriraient
/// une ligne éditoriale et non un sommaire.
/// <para>
/// <b>Pourquoi une table à part et non <see cref="Theme"/> ?</b> Un thème est un vocabulaire
/// qu'on <i>réutilise</i> — « dark fantasy » revient sur dix livres —, alors qu'un titre
/// d'article est unique à sa parution et ne se réutilisera jamais. Rangés dans
/// <c>Themes</c>, « Ukraine : le front d'hiver » et ses semblables rempliraient de bruit un
/// vocabulaire qui sert le catalogue.
/// </para>
/// <para>
/// ⚠️ Conséquence directe : <b>pas de n-n</b>. Une simple clé étrangère vers le numéro suffit,
/// puisque rien ne se partage. C'est ce qui distingue cette table de <c>LivreTheme</c>.
/// </para>
/// <para>
/// ⚠️ La saisie se fait au <b>point-virgule</b>, et surtout pas à la virgule : un titre
/// d'article en contient souvent (« Ukraine, deux ans après »), et elle le couperait en deux.
/// Voir <see cref="ListeSaisie"/>.
/// </para>
/// </remarks>
public class ArticleUne
{
    public int Id { get; set; }

    public int NumeroRevueId { get; set; }

    public NumeroRevue? NumeroRevue { get; set; }

    /// <summary>Le titre tel qu'il est imprimé en couverture.</summary>
    public string Titre { get; set; } = string.Empty;

    /// <summary>Forme mise à plat, porteuse de l'unicité au sein du numéro.</summary>
    public string TitreNormalise { get; set; } = string.Empty;

    /// <summary>Rang d'affichage : l'ordre de saisie est celui de la couverture.</summary>
    public int Position { get; set; }

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