using MaBibli.Api.Services.Isbn;
using MaBibli.Shared.Dtos;

namespace MaBibli.Api.Endpoints;

public static class IsbnEndpoints
{
    /// <summary>
    /// Expose le lookup ISBN. Aucune écriture en base : cet endpoint pré-remplit un formulaire,
    /// il n'enregistre rien.
    /// </summary>
    public static IEndpointRouteBuilder MapIsbnEndpoints(this IEndpointRouteBuilder routes)
    {
        var groupe = routes.MapGroup("/api/isbn").WithTags("ISBN");

        groupe.MapGet("/{isbn}", async (
                string isbn,
                IIsbnLookupService service,
                CancellationToken ct) =>
            {
                var resultat = await service.RechercherAsync(isbn, ct);

                return resultat is null
                    ? Results.BadRequest(new { erreur = $"« {isbn} » n'est pas un ISBN valide." })
                    : Results.Ok(resultat);
            })
            .WithName("RechercherIsbn")
            .WithSummary("Cherche les notices correspondant à un ISBN (cascade BnF → OpenLibrary).")
            .WithDescription(
                "Renvoie TOUS les candidats trouvés (jusqu'à 5) : un même ISBN peut correspondre à "
                + "plusieurs rééditions. Le choix revient à l'utilisateur.")
            .Produces<ResultatLookupIsbn>()
            .Produces(StatusCodes.Status400BadRequest);

        // Recherche par titre : on ne connaît pas toujours l'ISBN d'un livre qu'on souhaite —
        // c'est même le cas normal, puisqu'on ne l'a pas en main. Hors du groupe /api/isbn,
        // qui parle d'un code-barres, alors qu'ici on part de mots.
        routes.MapGet("/api/notices", async (
                string? titre,
                string? auteur,
                IBnfClient bnf,
                CancellationToken ct) =>
            {
                if (string.IsNullOrWhiteSpace(titre))
                {
                    return Results.BadRequest(new { erreur = "Indiquez au moins un titre à chercher." });
                }

                var (candidats, avertissement) = await bnf.RechercherParTitreAsync(titre, auteur, ct);

                return Results.Ok(new ResultatLookupIsbn
                {
                    IsbnDemande = string.Empty,
                    Candidats = candidats,
                    Avertissements = avertissement is null ? [] : [avertissement],
                });
            })
            .WithTags("ISBN")
            .WithName("RechercherNotices")
            .WithSummary("Cherche des notices BnF par titre, éventuellement restreint à un auteur.")
            .WithDescription(
                "Les notices qui ne décrivent pas un livre (film, disque, jeu) sont écartées. "
                + "L'auteur n'est PAS post-filtré : le choix revient à l'utilisateur, qui voit "
                + "les auteurs de chaque notice.")
            .Produces<ResultatLookupIsbn>()
            .Produces(StatusCodes.Status400BadRequest);

        return routes;
    }
}
