@*
    Les champs d'un numéro de revue, partagés par l'ajout et la modification.

    Un seul exemplaire, et pas deux blocs jumeaux : le formulaire d'ajout et celui de
    modification doivent proposer exactement les mêmes champs, sinon une couverture ou une une
    saisies à la création ne seraient plus modifiables ensuite — ce qui est précisément le cas
    d'usage (on ajoute un numéro le jour où on l'achète, on en recopie la une plus tard).
*@
<div class="champs-numero">
    <label class="champ">
        <span class="champ-libelle">Numéro</span>
        <input class="champ-saisie" type="text" placeholder="43" @bind="Saisie.Numero"
               @bind:event="oninput" @onkeydown="SurTouche" autocomplete="off" />
    </label>

    <label class="champ">
        <span class="champ-libelle">Parution <span class="champ-aide">(facultatif)</span></span>
        <input class="champ-saisie" type="date" @bind="Parution" />
    </label>

    <label class="champ">
        <span class="champ-libelle">Note <span class="champ-aide">(facultatif)</span></span>
        <input class="champ-saisie" type="text" @bind="Saisie.Note" @bind:event="oninput"
               placeholder="dossier sur l'eau" autocomplete="off" />
    </label>
</div>

@*
    ⚠️ Séparateur : le POINT-VIRGULE, et pas la virgule des thèmes de livres. Un titre d'article
    en contient souvent (« Ukraine, deux ans après »), et la virgule le couperait en deux.
*@
<label class="champ">
    <span class="champ-libelle">
        À la une <span class="champ-aide">(titres séparés par des points-virgules)</span>
    </span>
    <input class="champ-saisie" type="text" @bind="Saisie.ArticlesTexte" @bind:event="oninput"
           placeholder="Ukraine, deux ans après ; Le retour du train de nuit" autocomplete="off" />
</label>

@*
    ⚠️ Une URL, pas une photo. Aucune source ne donne la couverture d'un NUMÉRO : l'ISSN désigne
    la revue, pas la parution. Et le projet ne stocke aucun fichier — « ebooks : fiches
    uniquement » vaut ici aussi.
*@
<label class="champ">
    <span class="champ-libelle">
        Couverture <span class="champ-aide">(adresse d'une image, facultatif)</span>
    </span>
    <input class="champ-saisie" type="url" @bind="Saisie.CoverUrl" @bind:event="oninput"
           placeholder="https://…" autocomplete="off" />
</label>

@code {
    [Parameter, EditorRequired] public AjoutNumeroRevue Saisie { get; set; } = default!;

    /// <summary>
    /// Date affichée par le champ, en <b>local</b>.
    /// </summary>
    /// <remarks>
    /// ⚠️ Le <c>&lt;input type="date"&gt;</c> produit une date sans fuseau. Elle est déclarée
    /// locale ici et convertie en UTC, comme toutes les dates du projet : sans cela la parution
    /// se décale d'un jour pour la moitié du globe. La conversion se fait dans le composant
    /// pour que les deux écrans qui s'en servent ne puissent pas l'oublier chacun de leur côté.
    /// </remarks>
    private DateTime? Parution
    {
        get => Saisie.DateParution?.ToLocalTime().Date;
        set => Saisie.DateParution = value is { } date
            ? DateTime.SpecifyKind(date, DateTimeKind.Local).ToUniversalTime()
            : null;
    }

    [Parameter] public EventCallback<KeyboardEventArgs> OnEntree { get; set; }

    private async Task SurTouche(KeyboardEventArgs e)
    {
        if (e.Key == "Enter")
        {
            await OnEntree.InvokeAsync(e);
        }
    }
}
