using Microsoft.Extensions.Logging; using LDBproject.Entities; using LDBproject.Repositories; using LDBproject.Reports; internal class ChartReport { private readonly IUpdateRep _updR; private readonly ILogger _logger; public ChartReport(IUpdateRep updR, ILogger logger) { _updR = updR ?? throw new ArgumentNullException(nameof(updR)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public bool CreateChart(string filePath, DateTime dateTime) { try { var updates = _updR.GetUpdateList().ToList(); // Materialize the query var data = GetData(updates, dateTime); System.Text.Encoding.RegisterProvider(System.Text.CodePagesEncodingProvider.Instance); new PdfBuilder(filePath).AddHeader("Card Updates") // More descriptive header .AddPieChart("Number of Times Card Updated", data) // Corrected caption .Build(); return true; } catch (Exception ex) { _logger.LogError(ex, "Error creating chart."); return false; } } private List<(string Caption, double Value)> GetData(List updates, DateTime date) { var result = new List<(string Caption, double Value)>(); var distinctCards = updates.Where(u => u.LastUpdate.Date == date.Date) // Filter by date .GroupBy(u => u.CardID) .Select(g => new { CardID = g.Key, Count = g.Count() }) .ToList(); foreach (var cardData in distinctCards) { result.Add(($"Card {cardData.CardID}", cardData.Count)); } return result; } }