using System; using System.Threading.Tasks; using Compliance.DTOs; using Compliance.Domain.Models; namespace Compliance.Services.ValidationRules { public class ReadingPeriodValidationRule : IValidationRule { private const string RULE_NAME = "Reading Period Validation"; private const int MIN_READING_DAYS = 27; private const int MAX_READING_DAYS = 33; private const string PERIOD_ERROR_FORMAT = "Reading period of {0} days is outside allowed range ({1}-{2} days)"; public int Priority => 1; public Task ValidateAsync( BillComplianceRequest request, DistributorInformation distributorInfo, Client clientInfo) { var readingPeriod = CalculateReadingPeriod(request); var isValid = IsValidReadingPeriod(readingPeriod); return Task.FromResult(isValid ? ValidationResult.Success(RULE_NAME) : ValidationResult.Failure(RULE_NAME, FormatErrorMessage(readingPeriod))); } private static int CalculateReadingPeriod(BillComplianceRequest request) => (request.CurrentReadingDate - request.PreviousReadingDate).Days; private static bool IsValidReadingPeriod(int days) => days >= MIN_READING_DAYS && days <= MAX_READING_DAYS; private static string FormatErrorMessage(int days) => string.Format(PERIOD_ERROR_FORMAT, days, MIN_READING_DAYS, MAX_READING_DAYS); } }