using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using System;
using System.Collections.Generic;

namespace AsbCloudApp.Repositories
{
    /// <summary>
    /// Хранилище кеша
    /// </summary>
    /// <typeparam name="TDto"></typeparam>
    public interface ITelemetryDataCache<TDto> where TDto : ITelemetryData
    {
        /// <summary>
        /// добавить в кеш чанк записей по телеметрии
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <param name="range"></param>
        void AddRange(int idTelemetry, IEnumerable<TDto> range);

        /// <summary>
        /// вернуть последнюю записть
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <returns></returns>
        TDto? GetLastOrDefault(int idTelemetry);

        /// <summary>
        /// Получить кешированые записи
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <param name="dateBegin"></param>
        /// <param name="intervalSec"></param>
        /// <param name="approxPointsCount">приблизительное кол-во возвращаемых записей после их прореживания</param>
        /// <returns></returns>
        IEnumerable<TDto>? GetOrDefault(int idTelemetry, DateTime dateBegin, double intervalSec = 600, int approxPointsCount = 1024);

        /// <summary>
        /// Получить кешированые записи
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <param name="request"></param>
        /// <returns></returns>
        IEnumerable<TDto>? GetOrDefault(int idTelemetry, TelemetryDataRequest request);

        /// <summary>
        /// Диапазон дат находящийся в кеше
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <returns></returns>
        DatesRangeDto? GetOrDefaultCachedaDateRange(int idTelemetry);

        /// <summary>
        /// Получить диапазон дат телеметрии.
        /// Дата первой записи телеметрии храниться отдельно и запоняется при инициализации
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <returns></returns>
        DatesRangeDto? GetOrDefaultDataDateRange(int idTelemetry);

        /// <summary>
        /// Получение первой и последней записи телеметрии.
        /// Первая запись телеметрии храниться отдельно и запоняется при инициализации
        /// </summary>
        /// <param name="idTelemetry"></param>
        /// <returns></returns>
        (TDto First, TDto Last)? GetOrDefaultFirstLast(int idTelemetry);
    }
}