private Eligibility_Ruleset mapRuleSetToPoco(RuleContainer ruleContainer, SystemUser user, EligibilityRuleSet ruleSet, int? parentRuleSetId) {
			return new Eligibility_Ruleset {
				Eligibility_Type_Id = (int)ruleSet.EligibilityType,
				Rule_Container_Id = ruleContainer.Id,
				Created_By = user.Id,
				Date_Created = DateTime.Now,
				Is_Deleted = false,
				Ruleset_Aggregator_Id = (int)ruleSet.Aggregator,
				Parent_Ruleset_Id = parentRuleSetId
			};
		}
		public virtual EligibilityRuleSet BuildRootRuleSet(RuleContainer customer, EligibilityTypeEnum eligibilityType) {
			if (customer == null)
				throw new ArgumentNullException(nameof(customer));

			var ruleSet = _eligibilityRepository.GetRootEligibilityRuleSet(customer, eligibilityType);
			if (ruleSet == null)
				throw new NoNullAllowedException($"There is no root {eligibilityType} Eligibility RuleSet for this {nameof(customer)}");
			
			var finalRuleSet = buildRuleSet(ruleSet);

			return finalRuleSet;
		}
		private int saveRuleSet(RuleContainer customer, SystemUser user, EligibilityRuleSet ruleSet, int? parentRuleSetId) {

			var ruleSetPoco = mapRuleSetToPoco(customer, user, ruleSet, parentRuleSetId);
			var ruleSetId = _eligibilityRepository.CreateRuleSet(ruleSetPoco);

			foreach (var rule in ruleSet.Rules) {
				_ruleStorer.SaveRule(user, rule, ruleSetId);
			}

			foreach (var childRuleSet in ruleSet.ChildRuleSets) {
				saveRuleSet(customer, user, childRuleSet, ruleSetId);
			}
			
			return ruleSetId;
		}
		public virtual int SaveRootRuleSet(RuleContainer customer, SystemUser user, EligibilityRuleSet ruleSet) {
			if (customer == null)
				throw new ArgumentNullException(nameof(customer));
			if (user == null)
				throw new ArgumentNullException(nameof(user));
			if (ruleSet == null)
				throw new ArgumentNullException(nameof(ruleSet));


			try {
				var ruleSetId = saveRuleSet(customer, user, ruleSet, null);
				return ruleSetId;
			}
			catch (Exception e) {
				Console.WriteLine(e);
				throw;
			}
		}