using GB5Shared.DTO.ReportOrchestration; using GB5Shared.Enums.ReportOrchestration; using Microsoft.Extensions.Logging; namespace FrameworkBLL.ReportOrchestration { /// /// Determines whether a report request should execute synchronously or /// be submitted as a SysJob, based on AsyncMode and date-range threshold. /// PolicyBased mode falls back to Auto until MREPORTPOLICY is implemented. /// public sealed class AsyncDecisionEngine : IAsyncDecisionEngine { private readonly ILogger _logger; public AsyncDecisionEngine(ILogger logger) { _logger = logger; } public Task ShouldRunAsyncAsync( ReportExecutionContext context, CancellationToken cancellationToken = default) { if (context.ReportConfig is null) { // No config loaded — default to sync (safe) return Task.FromResult(false); } bool isAsync = context.ReportConfig.AsyncMode switch { AsyncMode.AlwaysAsync => true, AsyncMode.AlwaysSync => false, AsyncMode.PolicyBased => EvaluateAutoThreshold(context), // Policy not yet implemented; falls back to Auto AsyncMode.Auto => EvaluateAutoThreshold(context), _ => false }; if (isAsync) _logger.LogDebug( "AsyncDecision=Async for ReportId={ReportId} AsyncMode={Mode} DateRangeDays={Days}", context.ReportId, context.ReportConfig.AsyncMode, context.DateRangeDays); return Task.FromResult(isAsync); } private bool EvaluateAutoThreshold(ReportExecutionContext context) => context.DateRangeDays > context.ReportConfig!.AsyncThresholdDays; } }