using PARR.Core.Services.UnitFilterService.Models;
using PARR.Domain.Entities.Job;

namespace PARR.Core.Services.UnitFilterService
{
    public interface IUnitFilterService
    {
        /// <summary>
        /// Получает список ID Unit'ов, соответствующих фильтрам Job.
        /// </summary>
        /// <param name="jobId">ID Job</param>
        /// <param name="takeCount">Максимальное количество Unit'ов (опционально)</param>
        /// <returns>Список ID Unit'ов или null, если Job не найден</returns>
        //Task<IEnumerable<Guid>?> GetUnitsIdByJobFilterAsync(
        //    Guid jobId,
        //    int? takeCount = null);

        /// <summary>
        /// Получает список ID Unit'ов, соответствующих фильтрам Job.
        /// </summary>
        /// <param name="job">Job с предзагруженными UnitFilters, Group, GroupType</param>
        /// <param name="takeCount">Максимальное количество Unit'ов (опционально)</param>
        /// <returns>Список ID Unit'ов</returns>
        Task<IEnumerable<Guid>?> GetUnitsIdByJobFilterAsync(
            Job job,
            int? takeCount = null,
            CancellationToken cancellationToken = default);

        /// <summary>
        /// Получает отфильтрованные Unit'ы с полной информацией о значениях полей и связях.
        /// Возвращает DTO с данными для дальнейшей обработки в синхронизаторах.
        /// </summary>
        /// <param name="jobId">ID Job</param>
        /// <param name="takeCount">Максимальное количество Unit'ов (опционально)</param>
        /// <returns>Список UnitFilterResultDto или null, если Job не найден</returns>
        Task<IEnumerable<UnitFilterResultDto>?> GetUnitsByJobFilterAsync(
            Guid jobId,
            int? takeCount = null,
            CancellationToken cancellationToken = default);

        /// <summary>
        /// Получает отфильтрованные Unit'ы с полной информацией о значениях полей и связях.
        /// Возвращает DTO с данными для дальнейшей обработки в синхронизаторах.
        /// </summary>
        /// <param name="job">Job с предзагруженными UnitFilters, Group, GroupType</param>
        /// <param name="takeCount">Максимальное количество Unit'ов (опционально)</param>
        /// <returns>Список UnitFilterResultDto</returns>
        Task<IEnumerable<UnitFilterResultDto>?> GetUnitsByJobFilterAsync(
            Job job,
            int? takeCount = null,
            CancellationToken cancellationToken = default
            );

        /// <summary>
        /// Получает имена связанных Unit'ов для заданного Unit, отфильтрованных по RelationshipFilters Job.
        /// Используется для шорткода %СВЯЗИ%.
        /// </summary>
        /// <param name="jobId">ID Job</param>
        /// <param name="unitId">ID Unit, для которого ищутся связи</param>
        /// <returns>Список имён связанных Unit'ов (уникальные, без дублей)</returns>
        Task<List<string>> GetRelatedUnitNamesAsync(
            Guid jobId,
            Guid unitId,
            CancellationToken cancellationToken = default
            );
    }
}
