using LiteCqrs;
using TeleWave.Application.Storage;
using TeleWave.Infrastructure.Identity;

namespace TeleWave.Api.Endpoints;

/// <summary>Чем занят диск: объём по областям хранилища и заполненность тома.</summary>
public static class StorageEndpoints
{
    public static IEndpointRouteBuilder MapStorageEndpoints(this IEndpointRouteBuilder app)
    {
        app.MapGet("/api/admin/storage", Stats)
            .WithTags("Admin.Storage")
            .RequireAuthorization(policy => policy.RequireRole(RoleNames.Admin))
            .Produces<StorageStatsDto>();

        return app;
    }

    /// <param name="refresh">Пересчитать, не дожидаясь истечения кэша: обход дерева долгий.</param>
    private static async Task<IResult> Stats(
        bool? refresh,
        ISender sender,
        CancellationToken cancellationToken
    )
    {
        var result = await sender.Send(
            new GetStorageStatsQuery(refresh ?? false),
            cancellationToken
        );
        return Results.Ok(result);
    }
}
