using LiteCqrs;
using TeleWave.Application.Broadcast;
using TeleWave.Application.Common.Models;

namespace TeleWave.Application.Programming.Planning.ApplyTemplate;

public sealed class ApplyChannelTemplateCommandHandler(GridScheduleGenerator generator)
    : ICommandHandler<ApplyChannelTemplateCommand, Result<ApplyResultDto>>
{
    public async Task<Result<ApplyResultDto>> Handle(
        ApplyChannelTemplateCommand command,
        CancellationToken cancellationToken
    )
    {
        // Генератор держит собственную транзакцию с advisory-локом канала, поэтому команда
        // ограничивается вызовом и переводом результата в DTO.
        var report = await generator.GenerateAsync(
            command.ChannelId,
            DateTimeOffset.UtcNow,
            rebuildFuture: true,
            cancellationToken
        );

        if (report.ChannelSkipped)
            return Result.Failure<ApplyResultDto>(ChannelErrors.TemplateNotFound);

        return Result.Success(
            new ApplyResultDto(
                report.Added,
                report
                    .Warnings.Select(w => new PlanningWarningDto(w.Kind, w.SlotId, w.Details))
                    .ToList()
            )
        );
    }
}
