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

namespace PARR.TemplateMatcher.Services.Implementations.GroupedSync;

internal class ProcessGroupsStage : IGroupedSyncWriteStage
{
    private readonly IGroupedTemplateProcessor _processor;
    private readonly ILogger<ProcessGroupsStage> _logger;

    public string StageName => "Обработка групп";

    public ProcessGroupsStage(IGroupedTemplateProcessor processor, ILogger<ProcessGroupsStage> logger)
    {
        _processor = processor;
        _logger = logger;
    }

    public async Task<GroupedSyncContext> ExecuteAsync(GroupedSyncContext context, CancellationToken ct = default)
    {
        // Приведение типа обратно из object — пайплайн хранит как object для универсальности контекста
        var typedGroups = context.TemplateGroups
            .Cast<GroupedTemplateGroup>()
            .ToList();

        var expectedKeys = await _processor.ProcessAsync(
            typedGroups, context.JobsInGroup, context.MaxJob, context.Initiator);

        context.ExpectedTemplateKeys = expectedKeys;

        _logger.LogDebug("JobGroup '{JobGroupName}' ({JobGroupId}): обработано групп, ожидаемых ключей={Count}",
            context.JobGroupName, context.JobGroupId, expectedKeys.Count);

        return context;
    }
}