using AsbCloudApp.Services; using AsbCloudApp.Data; using AsbCloudDb.Model; using System; using System.Collections.Generic; using System.Linq; using System.IO; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using AsbSaubReport; namespace AsbCloudInfrastructure.Services { public class ReportService : IReportService { private readonly IAsbCloudDbContext db; private readonly IConfiguration configuration; private readonly ITelemetryService telemetryService; private readonly IBackgroundQueue queue; public ReportService(IAsbCloudDbContext db, IConfiguration configuration, ITelemetryService telemetryService, IBackgroundQueue queue) { this.db = db; this.configuration = configuration; this.telemetryService = telemetryService; this.queue = queue; RootPath = "reports"; } public string RootPath { get ; private set; } public int CreateReport(int wellId, int stepSeconds, int format, DateTime begin, DateTime end, Action progressHandler) { var newReportId = queue.EnqueueTask((id) => { var optionsBuilder = new DbContextOptionsBuilder(); optionsBuilder.UseNpgsql(configuration.GetConnectionString("DefaultConnection")); using (var context = new AsbCloudDbContext(optionsBuilder.Options)) { var generator = GetReportGenerator(wellId, begin, end, stepSeconds, format, context); generator.OnProgress += (s,e) => progressHandler.Invoke(e.progress, e.operation, id); var newReportName = generator.Make(); if(newReportName is not null) { var newReportProperties = new Report { Name = newReportName, WellId = wellId, Date = DateTime.Now, Begin = begin, End = end, Step = stepSeconds, Format = format }; context.Reports.Add(newReportProperties); db.SaveChanges(); } } }); return newReportId; } public int GetReportPagesCount(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var generator = GetReportGenerator(wellId, begin, end, stepSeconds, format, (AsbCloudDbContext)db); return generator.GetPagesCount(); } public IEnumerable GetExistingReportNames(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var suitableReportsFromDb = GetSuitableReportNamesFromDb(wellId, begin, end, stepSeconds, format); var reportsFolder = Path.Combine(RootPath, $"{wellId}"); var suitableReportNames = Directory.GetFiles(reportsFolder) .Select(Path.GetFileName) .Where(name => suitableReportsFromDb.Contains(name)); return suitableReportNames; } public DatesRangeDto GetReportsDatesRange(int wellId) { var telemetry = telemetryService.GetTelemetryByWellId(wellId); if (telemetry is null) return null; var datesRange = (from d in db.DataSaubBases where d.IdTelemetry == telemetry.Id select d.Date).Union( from m in db.Messages where m.IdTelemetry == telemetry.Id select m.Date).ToList(); return new DatesRangeDto { From = datesRange is null ? DateTime.MinValue : datesRange.Min(), To = datesRange is null ? DateTime.MaxValue : datesRange.Max() }; } private IEnumerable GetSuitableReportNamesFromDb(int wellId, DateTime begin, DateTime end, int stepSeconds, int format) { var suitableReportsNames = (from r in db.Reports where r.WellId == wellId && r.Begin == begin && r.End == end && r.Step == stepSeconds && r.Format == format select r.Name).ToList(); return suitableReportsNames; } private IReportGenerator GetReportGenerator(int wellId, DateTime begin, DateTime end, int stepSeconds, int format, AsbCloudDbContext context) { var dataSource = new ReportDataSourcePgCloud(context, wellId); var generator = new PdfGenerator(dataSource) { ReportDirectory = Path.Combine(RootPath, $"{wellId}"), Begin = begin, End = end, Step = TimeSpan.FromSeconds(stepSeconds), WithCharts = true, WithEvents = true }; switch(format) { case 0: return generator; case 1: return generator; default: return generator; } } } }