using AsbCloudApp.Requests;
using AsbCloudDb.Model;
using AsbCloudInfrastructure;
using AsbCloudInfrastructure.Repository;
using Microsoft.Extensions.Caching.Memory;
using System;
using System.Linq;
using System.Threading;

namespace ConsoleApp1
{
    class Program
    {
        private static AsbCloudDbContext db = ServiceFactory.Context;

        // use ServiceFactory to make services
        static void Main(/*string[] args*/)
        {
            DependencyInjection.MapsterSetup();
            var sw = System.Diagnostics.Stopwatch.StartNew();

            var idTelemetry = 5;

            var query = db.Set<TelemetryDataSaub>()
                .Where(t => t.IdTelemetry == idTelemetry)
                .Where(t => t.BlockPosition > 0.0001)
                .Where(t => t.WellDepth > 0.0001)
                .Where(t => t.WellDepth - t.BitDepth < 0.01)
                .GroupBy(t => new { H = t.DateTime.Hour, W = Math.Truncate(t.WellDepth!.Value) })
                .Select(g => new
                {
                    Count = g.Count(),

                    DateMin = g.Min(t => t.DateTime),
                    DateMax = g.Max(t => t.DateTime),

                    WellDepthMin = g.Min(t => t.WellDepth),
                    WellDepthMax = g.Max(t => t.WellDepth),

                    Pressure = g.Average(t => t.Pressure),
                    PressureSp = g.Average(t => t.PressureSp),
                    PressureSpRotor = g.Average(t => t.PressureSpRotor),
                    PressureSpSlide = g.Average(t => t.PressureSpSlide),
                    PressureIdle = g.Average(t => t.PressureIdle),
                    PressureDeltaLimitMax = g.Average(t => t.PressureDeltaLimitMax),

                    AxialLoad = g.Average(t => t.AxialLoad),
                    AxialLoadSp = g.Average(t => t.AxialLoadSp),
                    AxialLoadLimitMax = g.Average(t => t.AxialLoadLimitMax),

                    RotorTorque = g.Average(t => t.RotorTorque),
                    RotorTorqueSp = g.Average(t => t.RotorTorqueSp),
                    RotorTorqueIdle = g.Average(t => t.RotorTorqueIdle),

                    BlockSpeed = g.Average(t => t.BlockSpeed),
                    BlockSpeedSp = g.Average(t => t.BlockSpeedSp),
                    BlockSpeedSpRotor = g.Average(t => t.BlockSpeedSpRotor),
                    BlockSpeedSpSlide = g.Average(t => t.BlockSpeedSpSlide),
                })
                .Where(s => s.WellDepthMin != s.WellDepthMax)
                .Where(s => s.Count > 3)
                .OrderBy(t => t.DateMin);
            var data = query.ToArray();
            sw.Stop();
            Console.WriteLine($"total time: {sw.ElapsedMilliseconds} ms");
            var count = data.Length;
            Console.ReadLine();
        }
    }
}