@*
    Formulaire d'une fiche livre, partagé par l'ajout (ISBN ou manuel) et l'édition.

    Le pré-remplissage par ISBN est une AIDE, pas une contrainte : tous les champs restent
    modifiables, et une fiche incomplète peut toujours être complétée à la main (CLAUDE.md).
*@
<div class="formulaire">
    @if (!string.IsNullOrEmpty(Saisie.CoverUrl) || !string.IsNullOrWhiteSpace(Saisie.Titre))
    {
        <div class="formulaire-apercu">
            <Couverture Url="@Saisie.CoverUrl" Titre="@Saisie.Titre" Classe="couverture-moyenne" />
        </div>
    }

    <label class="champ">
        <span class="champ-libelle">Titre <span class="obligatoire" aria-hidden="true">*</span></span>
        <input class="champ-saisie" type="text" @bind="Saisie.Titre" @bind:event="oninput"
               placeholder="Titre du livre" autocomplete="off" />
    </label>

    @*
        Un seul champ, plusieurs auteurs : le point-virgule les sépare. La virgule est déjà
        prise par la forme bibliographique « Zola, Émile », qu'on doit pouvoir taper telle quelle.
        Le serveur rapproche ensuite les variantes sûres d'un auteur déjà connu.
    *@
    <label class="champ">
        <span class="champ-libelle">
            Auteur<span class="champ-aide"> (plusieurs : séparez par « ; »)</span>
        </span>
        <input class="champ-saisie" type="text" @bind="Saisie.Auteur" @bind:event="oninput"
               placeholder="Prénom Nom ; Prénom Nom" autocomplete="off" />
    </label>

    <label class="champ">
        <span class="champ-libelle">Éditeur</span>
        <input class="champ-saisie" type="text" @bind="Saisie.Editeur" @bind:event="oninput"
               autocomplete="off" />
    </label>

    <label class="champ">
        <span class="champ-libelle">ISBN <span class="champ-aide">(facultatif)</span></span>
        <input class="champ-saisie" type="text" inputmode="numeric" @bind="Saisie.Isbn" @bind:event="oninput"
               placeholder="978…" autocomplete="off" />
    </label>

    <fieldset class="champ">
        <legend class="champ-libelle">Format</legend>
        <div class="segments">
            @foreach (var format in Formats)
            {
                <button type="button"
                        class="segment @(Saisie.Format == format ? "segment-actif" : null)"
                        @onclick="() => Saisie.Format = format">
                    @Libelles.Format(format)
                </button>
            }
        </div>
    </fieldset>

    <fieldset class="champ">
        <legend class="champ-libelle">
            Statut de lecture<span class="champ-aide"> (le vôtre)</span>
        </legend>
        <ChoixStatut Valeur="Saisie.Statut" ValeurChanged="s => Saisie.Statut = s" />
    </fieldset>

    <label class="champ">
        <span class="champ-libelle">URL de couverture</span>
        <input class="champ-saisie" type="url" @bind="Saisie.CoverUrl" @bind:event="oninput"
               placeholder="https://…" autocomplete="off" />
    </label>

    @if (!string.IsNullOrEmpty(Erreur))
    {
        <p class="message-erreur" role="alert">@Erreur</p>
    }

    <div class="actions-formulaire">
        <button type="button" class="bouton bouton-principal"
                disabled="@(EnCours || string.IsNullOrWhiteSpace(Saisie.Titre))"
                @onclick="Valider">
            @(EnCours ? "Enregistrement…" : LibelleValidation)
        </button>

        @if (OnAnnuler.HasDelegate)
        {
            <button type="button" class="bouton bouton-discret" disabled="@EnCours"
                    @onclick="OnAnnuler">
                Annuler
            </button>
        }
    </div>
</div>

@code {
    private static readonly Format[] Formats = Enum.GetValues<Format>();

    [Parameter, EditorRequired] public EnregistrementLivre Saisie { get; set; } = new();

    [Parameter] public string LibelleValidation { get; set; } = "Enregistrer";

    [Parameter] public string? Erreur { get; set; }

    [Parameter] public bool EnCours { get; set; }

    [Parameter] public EventCallback OnValider { get; set; }

    [Parameter] public EventCallback OnAnnuler { get; set; }

    private Task Valider() => OnValider.InvokeAsync();
}
