//using DD.Persistence.Models;
//using DD.Persistence.Models.Common;
//using DD.Persistence.Repositories;
//using Microsoft.EntityFrameworkCore;

//namespace DD.Persistence.Repository.Repositories;

//public class TimestampedValuesCachedRepository : TimestampedValuesRepository
//{
//    public static TimestampedValuesDto? FirstByDate { get; private set; }
//    public static CyclicArray<TimestampedValuesDto> LastData { get; } = new CyclicArray<TimestampedValuesDto>(CacheItemsCount);

//    private const int CacheItemsCount = 3600;

//    public TimestampedValuesCachedRepository(DbContext db, IDataSourceSystemRepository<ValuesIdentityDto> relatedDataRepository) : base(db, relatedDataRepository)
//    {
//        //Task.Run(async () =>
//        //{
//        //    var firstDateItem = await base.GetFirst(CancellationToken.None);
//        //    if (firstDateItem == null)
//        //    {
//        //        return;
//        //    }

//        //    FirstByDate = firstDateItem;

//        //    var dtos = await base.GetLast(CacheItemsCount, CancellationToken.None);
//        //    dtos = dtos.OrderBy(d => d.Timestamp);
//        //    LastData.AddRange(dtos);
//        //}).Wait();
//    }

//    public override async Task<IEnumerable<TimestampedValuesDto>> GetGtDate(Guid discriminatorId, DateTimeOffset dateBegin, CancellationToken token)
//    {

//        if (LastData.Count == 0 || LastData[0].Timestamp > dateBegin)
//        {
//            var dtos = await base.GetGtDate(discriminatorId, dateBegin, token);
//            return dtos;
//        }

//        var items = LastData
//            .Where(i => i.Timestamp >= dateBegin);

//        return items;
//    }

//    public override async Task<int> AddRange(Guid discriminatorId, IEnumerable<TimestampedValuesDto> dtos, CancellationToken token)
//    {
//        var result = await base.AddRange(discriminatorId, dtos, token);
//        if (result > 0)
//        {

//            dtos = dtos.OrderBy(x => x.Timestamp);

//            FirstByDate = dtos.First();
//            LastData.AddRange(dtos);
//        }

//        return result;
//    }

//    public override async Task<DatesRangeDto?> GetDatesRange(Guid discriminatorId, CancellationToken token)
//    {
//        if (FirstByDate == null)
//            return null;

//        return await Task.Run(() =>
//        {
//            return new DatesRangeDto
//            {
//                From = FirstByDate.Timestamp,
//                To = LastData[^1].Timestamp
//            };
//        });
//    }

//    public override async Task<IEnumerable<TimestampedValuesDto>> GetResampledData(
//        Guid discriminatorId,
//        DateTimeOffset dateBegin,
//        double intervalSec = 600d,
//        int approxPointsCount = 1024,
//        CancellationToken token = default)
//    {
//        var dtos = LastData.Where(i => i.Timestamp >= dateBegin);
//        if (LastData.Count == 0 || LastData[0].Timestamp > dateBegin)
//        {
//            dtos = await base.GetGtDate(discriminatorId, dateBegin, token);
//        }

//        var dateEnd = dateBegin.AddSeconds(intervalSec);
//        dtos = dtos
//            .Where(i => i.Timestamp <= dateEnd);

//        var ratio = dtos.Count() / approxPointsCount;
//        if (ratio > 1)
//            dtos = dtos
//                .Where((_, index) => index % ratio == 0);

//        return dtos;
//    }
//}