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;
}
}