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

namespace TeleWave.Application.Programming.Groups.Suggest;

public sealed class SuggestGroupsQueryHandler(
    IAppDbContext dbContext,
    GroupSuggestionBuilder builder
) : IQueryHandler<SuggestGroupsQuery, IReadOnlyList<GroupSuggestionDto>>
{
    public async Task<IReadOnlyList<GroupSuggestionDto>> Handle(
        SuggestGroupsQuery query,
        CancellationToken cancellationToken
    )
    {
        var suggestions = await builder.BuildAsync(cancellationToken);
        if (suggestions.Count == 0)
            return [];

        // Уже созданное отмечаем, но из списка не убираем: пропавшее без следа предложение читается
        // как сбой, а «уже есть» объясняет, почему кнопки нет.
        var existing = await dbContext
            .Groups.AsNoTracking()
            .Select(g => new { g.Name, g.FilterJson })
            .ToListAsync(cancellationToken);

        var names = existing
            .Select(g => g.Name.Trim())
            .ToHashSet(StringComparer.CurrentCultureIgnoreCase);
        var filters = existing
            .Select(g => g.FilterJson)
            .Where(json => !string.IsNullOrWhiteSpace(json))
            .ToHashSet(StringComparer.Ordinal);

        return
        [
            .. suggestions.Select(s => new GroupSuggestionDto(
                s.Key,
                s.Kind,
                s.Name,
                s.ShowIds.Count,
                s.UnitCount,
                s.TotalDuration.TotalSeconds,
                names.Contains(s.Name)
                    || (s.Filter is not null && filters.Contains(s.Filter.ToJson()))
            )),
        ];
    }
}
