using LiteCqrs;
using TeleWave.Api.Common;
using TeleWave.Application.Library.Interstitials;
using TeleWave.Application.Library.Interstitials.ImportInterstitials;
using TeleWave.Application.Library.Interstitials.ListInterstitialBlocks;
using TeleWave.Application.Library.Interstitials.ListInterstitials;
using TeleWave.Infrastructure.Identity;

namespace TeleWave.Api.Endpoints;

/// <summary>
/// Ролики-врезки: тот же <c>Show(Kind = Interstitial)</c>, но со своим экраном (см. 6.7). Правка
/// названия и удаление идут через обычные эндпоинты шоу — здесь только то, чего у библиотеки нет:
/// список с длительностями, блоки и импорт загруженных файлов.
/// </summary>
public static class InterstitialEndpoints
{
    public static IEndpointRouteBuilder MapInterstitialEndpoints(this IEndpointRouteBuilder app)
    {
        var admin = app.MapGroup("/api/admin/interstitials")
            .WithTags("Admin.Interstitials")
            .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin));

        admin.MapGet("", List).Produces<IReadOnlyList<InterstitialDto>>();
        admin.MapGet("/blocks", ListBlocks).Produces<IReadOnlyList<InterstitialBlockDto>>();
        admin.MapPost("/import", Import).Produces<ImportInterstitialsResponse>();

        return app;
    }

    private static async Task<IResult> List(ISender sender, CancellationToken cancellationToken)
    {
        var result = await sender.Send(new ListInterstitialsQuery(), cancellationToken);
        return Results.Ok(result);
    }

    private static async Task<IResult> ListBlocks(
        ISender sender,
        CancellationToken cancellationToken
    )
    {
        var result = await sender.Send(new ListInterstitialBlocksQuery(), cancellationToken);
        return Results.Ok(result);
    }

    private static async Task<IResult> Import(
        ImportInterstitialsBody body,
        ISender sender,
        CancellationToken cancellationToken
    )
    {
        var result = await sender.Send(
            new ImportInterstitialsCommand(body.MediaAssetIds),
            cancellationToken
        );
        return result.IsSuccess
            ? Results.Ok(new ImportInterstitialsResponse(result.Value))
            : result.ToHttpResult();
    }
}

public sealed record ImportInterstitialsBody(IReadOnlyList<Guid> MediaAssetIds);

public sealed record ImportInterstitialsResponse(int Imported);
