using System.Collections.Generic; using Compliance.Infrastructure.Repositories; using Compliance.Services.ValidationRules; namespace Compliance.Services.ValidationRules { public interface IValidationRuleFactory { IEnumerable CreateRules(); } public class ValidationRuleFactory(IDistributorRepository distributorRepository) : IValidationRuleFactory { private readonly IDistributorRepository _distributorRepository = distributorRepository; private IEnumerable? _cachedRules; private static class RuleTypes { public const string Tariff = nameof(TariffValidationRule); public const string Tax = nameof(TaxValidationRule); public const string TariffComponent = nameof(TariffComponentValidationRule); public const string FlagTariff = nameof(FlagTariffValidationRule); public const string PublicLighting = nameof(PublicLightingValidationRule); public const string ICMS = nameof(ICMSValidationRule); } public IEnumerable CreateRules() { return _cachedRules ??= CreateRulesInternal().OrderBy(r => r.Priority); } private Dictionary.ValueCollection CreateRulesInternal() { var rules = new Dictionary { [nameof(BasicInformationValidationRule)] = new BasicInformationValidationRule(), [nameof(ConsumptionValidationRule)] = new ConsumptionValidationRule(), [RuleTypes.TariffComponent] = new TariffComponentValidationRule(_distributorRepository), [RuleTypes.FlagTariff] = new FlagTariffValidationRule(_distributorRepository), [RuleTypes.PublicLighting] = new PublicLightingValidationRule(_distributorRepository), [RuleTypes.ICMS] = new ICMSValidationRule(_distributorRepository), [RuleTypes.Tax] = new TaxValidationRule(_distributorRepository) }; return rules.Values; } } }