using System; using System.Threading.Tasks; using Compliance.DTOs; using Compliance.Domain.Models; namespace Compliance.Services.ValidationRules { public class EmergencyValidationRule : IValidationRule { private const string RULE_NAME = "Emergency Situation Validation"; private const int MAX_EMERGENCY_PERIOD_DAYS = 180; private const decimal MIN_EMERGENCY_SUPPLY_PERCENTAGE = 10m; private const string MISSING_DECLARATION_ERROR = "Emergency declaration number is required for emergency situations"; private const string PERIOD_EXCEEDED_ERROR = "Emergency period cannot exceed 180 days"; private const string SUPPLY_BELOW_MINIMUM_ERROR = "Emergency supply must be at least 10% of normal load"; private const string BILLING_EXCEEDED_ERROR = "Emergency billing cannot exceed normal load billing estimate"; public int Priority => 1; // High priority for emergency situations public Task ValidateAsync( BillComplianceRequest request, DistributorInformation distributorInfo, Client clientInfo) { if (!request.IsEmergencySituation) return Task.FromResult(ValidationResult.Success(RULE_NAME)); var errors = ValidateEmergencyRequirements(request); return Task.FromResult(errors.Count == 0 ? ValidationResult.Success(RULE_NAME) : ValidationResult.Failure(RULE_NAME, errors)); } private static List ValidateEmergencyRequirements(BillComplianceRequest request) { var errors = new List(); // Art. 350 - Emergency Declaration Validation ValidateDeclaration(request, errors); // Art. 351 - Emergency Period Validation ValidatePeriod(request, errors); // Art. 352 - Emergency Supply Percentage Validation ValidateSupplyPercentage(request, errors); // Art. 353 - Emergency Billing Amount Validation ValidateBillingAmount(request, errors); return errors; } private static void ValidateDeclaration(BillComplianceRequest request, List errors) { if (string.IsNullOrEmpty(request.EmergencyDeclarationNumber)) errors.Add(MISSING_DECLARATION_ERROR); } private static void ValidatePeriod(BillComplianceRequest request, List errors) { if (request.EmergencyPeriodDays > MAX_EMERGENCY_PERIOD_DAYS) errors.Add(PERIOD_EXCEEDED_ERROR); } private static void ValidateSupplyPercentage(BillComplianceRequest request, List errors) { if (request.EmergencySupplyPercentage < MIN_EMERGENCY_SUPPLY_PERCENTAGE) errors.Add(SUPPLY_BELOW_MINIMUM_ERROR); } private static void ValidateBillingAmount(BillComplianceRequest request, List errors) { if (request.BillTotalBeforeLateCharges > request.NormalLoadBillEstimate) errors.Add(BILLING_EXCEEDED_ERROR); } } }