using Microsoft.Extensions.Logging;
using PARR.TemplateMatcher.Services.GroupedSync;

namespace PARR.TemplateMatcher.Services.Implementations.GroupedSync;

internal class GroupFilterStage : IGroupedSyncStage
{
    private readonly IGroupedTemplateUnitFilter _groupedFilter;
    private readonly ILogger<GroupFilterStage> _logger;

    public string StageName => "Групповая фильтрация";

    public GroupFilterStage(IGroupedTemplateUnitFilter groupedFilter, ILogger<GroupFilterStage> logger)
    {
        _groupedFilter = groupedFilter;
        _logger = logger;
    }

    public async Task<GroupedSyncContext> ExecuteAsync(GroupedSyncContext context, CancellationToken ct = default)
    {
        var finalFiltered = await _groupedFilter.FilterAsync(context.FilteredUnits, context.JobGroup);

        if (!finalFiltered.Any())
            throw new GroupedSyncEarlyExitException("Нет юнитов после групповой фильтрации");

        context.FilteredUnits = finalFiltered;

        _logger.LogDebug("JobGroup '{JobGroupName}' ({JobGroupId}): после групповой фильтрации {Count} юнитов",
            context.JobGroupName, context.JobGroupId, finalFiltered.Count);

        return context;
    }
}