using FrameworkDAL.CustomCode.EIPConversation.EIPCapability; using FrameworkDAL.DTO.EIPConversation; using Microsoft.Extensions.Logging; using System; using System.Threading; using System.Threading.Tasks; namespace FrameworkBLL.EIPConversation.EIPHandlers.EIPRisk { public class EIPRiskAssessment : IEIPRiskAssessment { private readonly IEIPCapabilityDAL _capabilityDAL; private readonly ILogger _logger; public EIPRiskAssessment(IEIPCapabilityDAL capabilityDAL, ILogger logger) { _capabilityDAL = capabilityDAL ?? throw new ArgumentNullException(nameof(capabilityDAL)); _logger = logger ?? throw new ArgumentNullException(nameof(logger)); } public async Task EvaluateRiskAsync( string capabilityCode, EIPExecutionContextDTO context, CancellationToken cancellationToken) { try { _logger.LogInformation( "RiskAssessment: Evaluating risk | Capability={Capability}", capabilityCode); var tenantId = context.TenantId ?? context.LoginDTO.ClientId; var config = await _capabilityDAL.GetRiskConfigByCodeAsync( capabilityCode, tenantId, context.LoginDTO, cancellationToken).ConfigureAwait(false); if (config is null) { _logger.LogWarning( "RiskAssessment: no active MEIPCAPABILITY row for CapabilityCode={Capability} — defaulting to LOW/no-OTP.", capabilityCode); return new EIPRiskResultDTO { RiskLevel = "LOW", RequiresOtp = false }; } var riskLevelName = config.RiskLevel switch { 1 => "LOW", 2 => "MEDIUM", 3 => "HIGH", 4 => "CRITICAL", _ => "LOW" }; return new EIPRiskResultDTO { RiskLevel = riskLevelName, RequiresOtp = config.RequiresOtp }; } catch (Exception ex) { _logger.LogError(ex, "RiskAssessment: Error evaluating risk | Capability={Capability}", capabilityCode); throw; } } } }