using System.Collections.Generic; using System.Threading.Tasks; using System.Linq; using Compliance.DTOs; using Compliance.Domain.Models; using Compliance.Infrastructure.Repositories; using Compliance.Services.ValidationRules; namespace Compliance.Services { public class BillComplianceService( IDistributorRepository distributorRepository, IClientRepository clientRepository, IValidationRuleFactory validationRuleFactory) : IBillComplianceService { private readonly IDistributorRepository _distributorRepository = distributorRepository; private readonly IClientRepository _clientRepository = clientRepository; private readonly IValidationRuleFactory _validationRuleFactory = validationRuleFactory; public async Task ValidateBillAsync(BillComplianceRequest request) { var distributorInfo = await _distributorRepository.GetDistributorInformationAsync( request.DistributorName, request.Month) ?? throw new InvalidOperationException("Distributor information not found"); var clientInfo = await _clientRepository.GetClientInformationAsync( request.SmartCode) ?? throw new InvalidOperationException("Client information not found"); var rules = _validationRuleFactory.CreateRules(); var validationResults = await Task.WhenAll( rules.Select(rule => rule.ValidateAsync(request, distributorInfo, clientInfo))); return new BillComplianceResponse { IsValid = validationResults.All(r => r.IsValid), ValidationResults = validationResults.Select(r => new ValidationResult { IsValid = r.IsValid, RuleName = r.RuleName, Message = r.Message }) }; } } }