using System; using System.Threading.Tasks; using Compliance.Domain.Models; using Compliance.DTOs; using Compliance.Infrastructure.Repositories; using System.Text; namespace Compliance.Services.ValidationRules { public class TariffValidationRule(IDistributorRepository distributorRepository) : IValidationRule { private readonly IDistributorRepository _distributorRepository = distributorRepository; private const string RULE_NAME = "Tariff Validation"; private const string TUSD_ERROR = "TUSD amount doesn't match the expected value based on consumption and tariff"; public int Priority => 1; public async Task ValidateAsync( BillComplianceRequest request, DistributorInformation distributorInfo, Client clientInfo) { var tariffInfo = await _distributorRepository.GetTariffInformationAsync( request.DistributorName, request.Month) ?? throw new InvalidOperationException("Tariff information not found"); var isValid = true; var message = new StringBuilder(); if (request.TUSDAmount != request.ConsumptionAmount * tariffInfo.TUSDValue) { isValid = false; message.Append(TUSD_ERROR); } return new ValidationResult { IsValid = isValid, RuleName = RULE_NAME, Message = message.ToString() }; } } }