@page "/revues"
@inject ServiceLivresApi Api
@inject EtatReseau Reseau
@implements IDisposable

<PageTitle>MaBibli — revues</PageTitle>

<h1 class="titre-page">Revues</h1>

<p class="message-discret">
    Une fiche par revue, les numéros à l'intérieur — douze numéros d'un magazine ne font pas
    douze fiches. Les revues ne sont pas au catalogue : ce ne sont pas des livres.
</p>

@if (_revues is null)
{
    <p class="message-discret" role="status">Chargement…</p>
}
else if (_revues.Count == 0)
{
    <p class="message-discret">
        Aucune revue. Scannez le code-barres d'un magazine depuis « Ajouter un ouvrage » :
        le code d'une revue commence par 977 et porte un ISSN, pas un ISBN. Sans code à lire,
        <a href="revues/ajout">saisissez-la à la main</a>.
    </p>
}
else
{
    <ul class="liste-series">
        @foreach (var revue in _revues)
        {
            <li class="carte-serie" @key="revue.Id">
                <a class="carte-titre" href="@($"revues/{revue.Id}")">@revue.Titre</a>

                <p class="carte-details">
                    <span>
                        @(revue.Numeros.Count == 0
                            ? "Aucun numéro"
                            : $"{revue.Numeros.Count} numéro{(revue.Numeros.Count > 1 ? "s" : "")}")
                    </span>

                    @if (!string.IsNullOrWhiteSpace(revue.Issn))
                    {
                        <span class="code-isbn">ISSN @FormatageIssn.Afficher(revue.Issn)</span>
                    }

                    @if (!string.IsNullOrWhiteSpace(revue.Editeur))
                    {
                        <span>@revue.Editeur</span>
                    }
                </p>

                @* Le dernier numéro reçu répond seul à « est-ce que je l'ai déjà ? », qui est la
                   question qu'on se pose devant un kiosque. *@
                @if (revue.Numeros.FirstOrDefault() is { } dernier)
                {
                    <p class="carte-details">Dernier : n° @dernier.Numero @Quand(dernier)</p>
                }
            </li>
        }
    </ul>
}

@*
    ⚠️ Le champ « nom d'une nouvelle revue » a quitté cet écran : l'ajout passe par la MÊME
    entrée que celle du catalogue, « Ajouter un ouvrage », qui scanne et reconnaît seule un
    code 977. Deux points de départ selon ce qu'on croit tenir obligeaient à trancher avant
    de regarder le code-barres.
*@
<nav class="actions-flottantes">
    @if (Reseau.EnLigne)
    {
        <a class="bouton bouton-principal" href="ajout">Ajouter un ouvrage</a>
        <a class="bouton bouton-discret" href="revues/ajout">Saisir une revue</a>
    }
    else
    {
        <button type="button" class="bouton bouton-principal" disabled
                title="@EtatReseau.MotifHorsLigne">Ajouter un ouvrage</button>
    }
</nav>

@code {
    private IReadOnlyList<RevueDto>? _revues;

    private static string Quand(NumeroRevueDto numero) =>
        numero.DateParution is { } date ? $"({date.ToLocalTime():MM/yyyy})" : string.Empty;

    protected override void OnInitialized() => Reseau.Change += SurChangementReseau;

    private void SurChangementReseau() => _ = InvokeAsync(async () =>
    {
        await ChargerAsync();
        StateHasChanged();
    });

    public void Dispose() => Reseau.Change -= SurChangementReseau;

    protected override Task OnInitializedAsync() => ChargerAsync();

    private async Task ChargerAsync() => _revues = await Api.ListerRevuesAsync();

}
