@page "/revues/ajout"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation
@inject EtatReseau Reseau

<PageTitle>MaBibli — saisir une revue</PageTitle>

<h1 class="titre-page">Saisir une revue</h1>

@*
    Le pendant de « Saisir un livre à la main » : ce qu'on fait quand le code-barres est absent,
    abîmé, ou que la BnF ne connaît pas le titre. L'entrée normale reste « Ajouter un ouvrage »,
    qui scanne et reconnaît un code 977 tout seul.
*@
<p class="message-discret">
    L'entrée habituelle est <a href="ajout">Ajouter un ouvrage</a> : le code-barres d'un
    magazine commence par <span class="code-isbn">977</span> et l'application le reconnaît
    seule. Ce formulaire sert quand il n'y a pas de code à lire.
</p>

@if (!Reseau.EnLigne)
{
    <p class="message-avertissement" role="status">
        Hors ligne : l'enregistrement passe par le serveur. Il redeviendra possible au retour
        du réseau.
    </p>
}

@if (_erreur is not null)
{
    <p class="message-erreur" role="alert">@_erreur</p>
}

<label class="champ">
    <span class="champ-libelle">Titre<span class="obligatoire"> *</span></span>
    <input class="champ-saisie" type="text" @bind="_titre" @bind:event="oninput"
           placeholder="Médor" autocomplete="off" />
</label>

<label class="champ">
    <span class="champ-libelle">
        ISSN<span class="champ-aide"> (facultatif — huit chiffres, imprimé près du code-barres ; le tiret est posé à l'enregistrement)</span>
    </span>
    <input class="champ-saisie" type="text" @bind="_issn" @bind:event="oninput"
           placeholder="2466-6718" autocomplete="off" />
</label>

<label class="champ">
    <span class="champ-libelle">Éditeur<span class="champ-aide"> (facultatif)</span></span>
    <input class="champ-saisie" type="text" @bind="_editeur" @bind:event="oninput"
           autocomplete="off" />
</label>

<p class="champ-aide">
    Les numéros s'ajoutent ensuite sur la fiche de la revue : une fiche par revue, les numéros
    à l'intérieur.
</p>

<nav class="actions-flottantes">
    <button type="button" class="bouton bouton-principal"
            disabled="@(_enCours || !Reseau.EnLigne || string.IsNullOrWhiteSpace(_titre))"
            title="@(Reseau.EnLigne ? null : EtatReseau.MotifHorsLigne)"
            @onclick="EnregistrerAsync">
        @(_enCours ? "Enregistrement…" : "Créer la revue")
    </button>
</nav>

@code {
    private string _titre = string.Empty;
    private string _issn = string.Empty;
    private string _editeur = string.Empty;
    private bool _enCours;
    private string? _erreur;

    /// <summary>
    /// Crée la revue — ou retrouve celle qui existe déjà — puis ouvre sa fiche.
    /// </summary>
    /// <remarks>
    /// Le serveur fait « créer ou retrouver » sur l'ISSN <b>ou</b> le titre : saisir deux fois
    /// la même revue mène à la même fiche au lieu d'un refus. C'est aussi ce qui permet à une
    /// revue saisie ici d'apprendre son ISSN au premier scan.
    /// <para>
    /// On enchaîne sur la fiche plutôt que de revenir à la liste : le geste n'est jamais
    /// « créer une revue », c'est toujours « ranger un numéro ».
    /// </para>
    /// </remarks>
    private async Task EnregistrerAsync()
    {
        _enCours = true;
        _erreur = null;

        var resultat = await Api.CreerRevueAsync(new EnregistrementRevue
        {
            Titre = _titre,
            Issn = string.IsNullOrWhiteSpace(_issn) ? null : _issn,
            Editeur = string.IsNullOrWhiteSpace(_editeur) ? null : _editeur,
        });

        _enCours = false;

        if (!resultat.EstOk || resultat.Valeur is not { } revue)
        {
            _erreur = resultat.Erreur ?? "La revue n'a pas pu être créée.";
            return;
        }

        Navigation.NavigateTo($"revues/{revue.Id}");
    }
}
