using LiteCqrs;
using Microsoft.EntityFrameworkCore;
using TeleWave.Application.Common.Interfaces;

namespace TeleWave.Application.Programming.Groups.ListGroups;

public sealed class ListGroupsQueryHandler(IAppDbContext dbContext)
    : IQueryHandler<ListGroupsQuery, IReadOnlyList<GroupSummaryDto>>
{
    public async Task<IReadOnlyList<GroupSummaryDto>> Handle(
        ListGroupsQuery query,
        CancellationToken cancellationToken
    )
    {
        // Список читает кэш статистики, не пересчитывая его: пересчёт идёт при правке состава и при
        // открытии карточки. У динамической группы кэш поэтому может отставать от библиотеки —
        // рядом с цифрами показывается время расчёта (StatsComputedAt), и это честнее, чем гонять
        // правила всех групп на каждый показ списка.
        return await dbContext
            .Groups.AsNoTracking()
            .OrderBy(g => g.Name)
            .Select(g => new GroupSummaryDto(
                g.Id,
                g.Name,
                g.Description,
                g.ItemCount,
                g.UnitCount,
                g.TotalDuration.TotalSeconds,
                g.FilterJson != null,
                g.Mode,
                g.StatsComputedAt,
                g.CreatedAt
            ))
            .ToListAsync(cancellationToken);
    }
}
