using LiteCqrs; using Microsoft.EntityFrameworkCore; using TeleWave.Application.Common.Interfaces; using TeleWave.Application.Common.Models; using TeleWave.Domain.Broadcast; namespace TeleWave.Application.Broadcast.CreateOverride; public sealed class CreateProgrammingOverrideCommandHandler(IAppDbContext dbContext) : ICommandHandler> { public async Task> Handle( CreateProgrammingOverrideCommand command, CancellationToken cancellationToken ) { var weekly = command.Recurrence == OverrideRecurrence.Weekly; if (weekly) { if ( command.DayOfWeek is not (>= 0 and <= 6) || command.StartMinute is not { } sm || command.EndMinute is not { } em || em <= sm || sm < 0 || em > 1440 ) return Result.Failure(ChannelErrors.InvalidOverrideWindow); } else if ( command.StartsAtUtc is not { } start || command.EndsAtUtc is not { } end || end <= start ) { return Result.Failure(ChannelErrors.InvalidOverrideWindow); } if (command.Shows.Count == 0) return Result.Failure(ChannelErrors.OverrideNeedsShow); var channel = await dbContext .Channels.Include(c => c.Overrides) .ThenInclude(o => o.Shows) .FirstOrDefaultAsync(c => c.Id == command.ChannelId, cancellationToken); if (channel is null) return Result.Failure(ChannelErrors.NotFound); var showIds = command.Shows.Select(s => s.ShowId).Distinct().ToList(); var existingCount = await dbContext.Shows.CountAsync( s => showIds.Contains(s.Id), cancellationToken ); if (existingCount != showIds.Count) return Result.Failure(ChannelErrors.ShowNotFound); var ovr = weekly ? channel.AddWeeklyOverride( command.Mode, command.DayOfWeek!.Value, command.StartMinute!.Value, command.EndMinute!.Value ) : channel.AddOverride( command.Mode, command.StartsAtUtc!.Value, command.EndsAtUtc!.Value ); foreach (var show in command.Shows) ovr.AddShow(show.ShowId, show.Weight); return Result.Success(ovr.Id); } }