using LiteCqrs; using Microsoft.EntityFrameworkCore; using TeleWave.Application.Common.Interfaces; using TeleWave.Application.Common.Models; using TeleWave.Domain.Programming; namespace TeleWave.Application.Programming.Groups.Suggest; public sealed class CreateGroupFromSuggestionCommandHandler( IAppDbContext dbContext, GroupSuggestionBuilder builder, GroupStatsService stats ) : ICommandHandler> { public async Task> Handle( CreateGroupFromSuggestionCommand command, CancellationToken cancellationToken ) { var suggestions = await builder.BuildAsync(cancellationToken); var suggestion = suggestions.FirstOrDefault(s => s.Key == command.Key); if (suggestion is null) return Result.Failure(GroupErrors.SuggestionNotFound); // Имя — ключ узнаваемости группы, и две «Мультфильм» в списке слота неразличимы. var taken = await dbContext.Groups.AnyAsync( g => g.Name.ToLower() == suggestion.Name.ToLower(), cancellationToken ); if (taken) return Result.Failure(GroupErrors.SuggestionAlreadyCreated); var group = Group.Create(suggestion.Name); group.SetFilter(suggestion.Filter?.ToJson()); foreach (var showId in suggestion.ShowIds) group.AddElement(GroupElementKind.Show, showId); dbContext.Groups.Add(group); await stats.RecomputeAsync(group, cancellationToken); return Result.Success(group.Id); } }