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

namespace TeleWave.Application.Broadcast.Bumpers;

public sealed class ListBumperTemplatesQueryHandler(IAppDbContext dbContext)
    : IQueryHandler<ListBumperTemplatesQuery, IReadOnlyList<BumperTemplateDto>>
{
    public async Task<IReadOnlyList<BumperTemplateDto>> Handle(
        ListBumperTemplatesQuery query,
        CancellationToken cancellationToken
    )
    {
        var templates = await dbContext
            .BumperTemplates.AsNoTracking()
            .Include(t => t.Variants)
            .OrderBy(t => t.Name)
            .ToListAsync(cancellationToken);

        // Блоки общие, поэтому «сколько врезок на меня ссылается» — не справка, а условие правки.
        var usage = await dbContext
            .JunctionElements.AsNoTracking()
            .Where(e => e.Kind == JunctionElementKind.Bumper && e.BumperTemplateId != null)
            .GroupBy(e => e.BumperTemplateId!.Value)
            .Select(g => new { TemplateId = g.Key, Count = g.Count() })
            .ToDictionaryAsync(x => x.TemplateId, x => x.Count, cancellationToken);

        return templates.Select(t => BumperMapper.ToDto(t, usage.GetValueOrDefault(t.Id))).ToList();
    }
}
