using PARR.Core.Services.UnitFilterService.Models;
using PARR.Domain.Entities.Base.History;
using PARR.Domain.Entities.JobEntities;
using PARR.Domain.Entities.JobGroupEntities;
using PARR.TemplateMatcher.Models;

namespace PARR.TemplateMatcher.Services.Implementations.GroupedSync;

/// <summary>
/// Контекст групповой синхронизации. Передаётся между этапами.
/// </summary>
public class GroupedSyncContext
{
    public Guid JobGroupId { get; init; }
    public string JobGroupName { get; set; } = string.Empty;
    public HistoryInitiator Initiator { get; init; } = null!;
    public JobGroup JobGroup { get; set; } = null!;
    public List<Job> JobsInGroup { get; set; } = new();
    public Job MaxJob { get; set; } = null!;
    public List<UnitFilterResultDto> FilteredUnits { get; set; } = new();
    public Dictionary<Guid, List<Guid>> ReverseMapping { get; set; } = new();
    public List<GroupedTemplateGroup> TemplateGroups { get; set; } = new();
    public HashSet<(Guid JobId, Guid UnitId, int Index)> ExpectedTemplateKeys { get; set; } = new();

    /// <summary>
    /// Имена юнитов для логирования. Заполняется на этапе фильтрации.
    /// </summary>
    public Dictionary<Guid, string> UnitNames { get; set; } = new();

    /// <summary>
    /// Возвращает строку вида 'Имя' (ID) для логирования.
    /// </summary>
    public string FormatUnit(Guid unitId)
    {
        return UnitNames.TryGetValue(unitId, out var name)
            ? $"'{name}' ({unitId})"
            : $"({unitId})";
    }
}