using AsbCloudApp.Data;
using AsbCloudApp.Requests;
using AsbCloudInfrastructure.Services.SAUB;
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? GetOrDefaultCachedDataDateRange(int idTelemetry);

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

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

    /// <summary>
    /// статистика хранимой телеметрии по всем кешированым
    /// </summary>
    /// <returns></returns>
    IEnumerable<TelemetryDataStatDto> GetStat();

    /// <summary>
    /// Получить ключи телеметрии по параметрам запроса
    /// </summary>
    /// <param name="request"></param>
    /// <returns></returns>
    IEnumerable<int> GetIds(TelemetryDataRequest request);
}