diff --git a/CertReports.Syncfusion/Services/Implementations/FundReportOrchestrator.cs b/CertReports.Syncfusion/Services/Implementations/FundReportOrchestrator.cs new file mode 100644 index 0000000..6374b6a --- /dev/null +++ b/CertReports.Syncfusion/Services/Implementations/FundReportOrchestrator.cs @@ -0,0 +1,70 @@ +using CertReports.Syncfusion.Models; +using CertReports.Syncfusion.Services.Interfaces; +using Syncfusion.Pdf; + +namespace CertReports.Syncfusion.Services.Implementations; + +public class FundReportOrchestrator : IFundReportOrchestrator +{ + private readonly IFundDataService _dataService; + private readonly FundAnagraficaRenderer _anagraficaRenderer; + private readonly FundChartSectionRenderer _chartRenderer; + private readonly IPdfMergerService _merger; + private readonly IPdfCacheService _cache; + private readonly ILogger _logger; + + public FundReportOrchestrator( + IFundDataService dataService, + FundAnagraficaRenderer anagraficaRenderer, + FundChartSectionRenderer chartRenderer, + IPdfMergerService merger, + IPdfCacheService cache, + ILogger logger) + { + _dataService = dataService; + _anagraficaRenderer = anagraficaRenderer; + _chartRenderer = chartRenderer; + _merger = merger; + _cache = cache; + _logger = logger; + } + + public async Task GenerateReportAsync(string isin, bool showBranding = false) + { + var cacheKey = showBranding ? $"fund:{isin}:branded" : $"fund:{isin}"; + var cached = _cache.Get(cacheKey); + if (cached != null) + { + _logger.LogInformation("Fund report per {Isin} servito da cache ({Size} bytes)", isin, cached.Length); + return cached; + } + + _logger.LogInformation("Generazione fund report per {Isin}", isin); + + var info = await _dataService.GetFundInfoAsync(isin); + if (info == null) + throw new InvalidOperationException($"Nessun dato trovato per ISIN {isin}"); + + var reportData = new FundReportData { Info = info, ShowBranding = showBranding }; + var sections = new List(); + + sections.Add(_anagraficaRenderer.Render(reportData)); + _logger.LogInformation("Sezione 'FundAnagrafica' generata per {Isin}", isin); + + var chartDoc = await _chartRenderer.RenderAsync(isin, info.Strumento); + if (chartDoc != null) + { + sections.Add(chartDoc); + _logger.LogInformation("Sezione 'FundChart' generata per {Isin}", isin); + } + else + { + _logger.LogWarning("Sezione 'FundChart' omessa per {Isin} (dati insufficienti o errore)", isin); + } + + var finalPdf = _merger.Merge(sections); + _cache.Set(cacheKey, finalPdf); + _logger.LogInformation("Fund report generato per {Isin}: {Size} bytes", isin, finalPdf.Length); + return finalPdf; + } +}