using DD.Persistence.Models;
using DD.Persistence.Models.Requests;

namespace DD.Persistence.Repositories
{
    /// <summary>
    /// Интерфейс по работе с технологическими сообщениями
    /// </summary>
    public interface ITechMessagesRepository
    {
        /// <summary>
        /// Получить страницу списка объектов
        /// </summary>
        /// <param name="request"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<PaginationContainer<TechMessageDto>> GetPage(PaginationRequest request, CancellationToken token);

        /// <summary>
        /// Добавление новых сообщений
        /// </summary>
        /// <param name="dtos"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<int> AddRange(Guid systemId, IEnumerable<TechMessageDto> dtos, Guid userId, CancellationToken token);

        /// <summary>
        /// Получение списка систем
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<DataSourceSystemDto>> GetSystems(CancellationToken token);

        /// <summary>
        /// Получение количества сообщений по категориям и системам автобурения
        /// </summary>
        /// <param name="categoryId">Id Категории важности</param>
        /// <param name="autoDrillingSystem">Система автобурения</param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<MessagesStatisticDto>> GetStatistics(IEnumerable<Guid> autoDrillingSystem, IEnumerable<int> categoryIds, CancellationToken token);

        /// <summary>
        /// Получить порцию записей, начиная с заданной даты 
        /// </summary>
        /// <param name="dateBegin"></param>
        /// <param name="take"></param>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<IEnumerable<TechMessageDto>> GetPart(DateTimeOffset dateBegin, int take, CancellationToken token);

        /// <summary>
        /// Получить диапазон дат, для которых есть данные в репозитории
        /// </summary>
        /// <param name="token"></param>
        /// <returns></returns>
        Task<DatesRangeDto?> GetDatesRangeAsync(CancellationToken token);
    }
}