@page "/livres/{Id:int}"
@inject ServiceLivresApi Api
@inject NavigationManager Navigation

<PageTitle>MaBibli — fiche du livre</PageTitle>

<h1 class="titre-page">Fiche du livre</h1>

@if (_introuvable)
{
    <p class="message-erreur" role="alert">Ce livre n'existe pas (ou plus).</p>
    <a class="bouton bouton-discret" href="">Retour au catalogue</a>
}
else if (_saisie is null)
{
    <p class="message-discret">Chargement…</p>
}
else
{
    <FormulaireLivre Saisie="_saisie"
                     LibelleValidation="Enregistrer les modifications"
                     Erreur="@_erreur"
                     EnCours="_enregistrement"
                     OnValider="EnregistrerAsync"
                     OnAnnuler="Retour" />

    @if (_livre is not null)
    {
        <p class="message-discret">
            Ajouté le @_livre.DateAjout.ToLocalTime().ToString("dd/MM/yyyy")
            @if (!string.IsNullOrWhiteSpace(_livre.AjoutePar))
            {
                @($" par {_livre.AjoutePar}")
            }
            @* Information de traçabilité, jamais un filtre : la bibliothèque est commune. *@
        </p>
    }

    <section class="zone-danger">
        @if (!_confirmationSuppression)
        {
            <button type="button" class="bouton bouton-danger" @onclick="() => _confirmationSuppression = true">
                Supprimer ce livre
            </button>
        }
        else
        {
            <p class="message-avertissement">
                Supprimer « @_saisie.Titre » définitivement ? L'historique de ses prêts partira avec.
            </p>
            <div class="actions-formulaire">
                <button type="button" class="bouton bouton-danger" disabled="@_suppression" @onclick="SupprimerAsync">
                    @(_suppression ? "Suppression…" : "Oui, supprimer")
                </button>
                <button type="button" class="bouton bouton-discret" disabled="@_suppression"
                        @onclick="() => _confirmationSuppression = false">
                    Annuler
                </button>
            </div>
        }
    </section>
}

@code {
    [Parameter] public int Id { get; set; }

    private LivreDto? _livre;
    private EnregistrementLivre? _saisie;
    private bool _introuvable;
    private bool _enregistrement;
    private bool _suppression;
    private bool _confirmationSuppression;
    private string? _erreur;

    protected override async Task OnParametersSetAsync()
    {
        _introuvable = false;
        _saisie = null;

        try
        {
            _livre = await Api.ObtenirAsync(Id);
        }
        catch (Exception ex)
        {
            _erreur = $"Chargement impossible : {ex.Message}";
            return;
        }

        if (_livre is null)
        {
            _introuvable = true;
            return;
        }

        _saisie = new EnregistrementLivre
        {
            Isbn = _livre.Isbn,
            Titre = _livre.Titre,

            // Les auteurs sont repris tels que rattachés au livre. Le statut, lui, est celui de
            // la personne qui édite : enregistrer ne touche jamais à la lecture de quelqu'un d'autre.
            Auteurs = _livre.Auteurs.Select(a => a.Nom).ToList(),
            Editeur = _livre.Editeur,
            Format = _livre.Format,
            Statut = _livre.Statut,
            CoverUrl = _livre.CoverUrl,
        };
    }

    private async Task EnregistrerAsync()
    {
        _enregistrement = true;
        _erreur = null;

        var resultat = await Api.ModifierAsync(Id, _saisie!);

        _enregistrement = false;

        if (!resultat.EstOk)
        {
            _erreur = resultat.Erreur;
            return;
        }

        Navigation.NavigateTo("/");
    }

    private async Task SupprimerAsync()
    {
        _suppression = true;
        var erreur = await Api.SupprimerAsync(Id);
        _suppression = false;

        if (erreur is not null)
        {
            _erreur = erreur;
            _confirmationSuppression = false;
            return;
        }

        Navigation.NavigateTo("/");
    }

    private void Retour() => Navigation.NavigateTo("/");
}
