class AssetGroupExceptionServiceImpl implements AssetGroupExceptionService {

	@Override
	public String createAssetGroupExceptions(final AssetGroupExceptionDetailsRequest assetGroupExceptionDetails, final String userId) throws PacManException {
		List<String> ruleIds = Lists.newArrayList();
		try {
			List<TargetTypeRuleDetails> targetTypes = assetGroupExceptionDetails.getTargetTypes();
			deleteAssetGroupExceptions(new DeleteAssetGroupExceptionRequest(assetGroupExceptionDetails.getExceptionName().trim(), assetGroupExceptionDetails.getAssetGroup().trim()), userId);	
			if (updateExceptionToES(assetGroupExceptionDetails)) {
				try {
					boolean haveNoRules = true;
					List<AssetGroupException> allAssetGroupExceptions = Lists.newArrayList();
					for (int targetIndex = 0; targetIndex < targetTypes.size(); targetIndex++) {
						List<RuleDetails> rules = targetTypes.get(targetIndex).getRules();
						for (int ruleIndex = 0; ruleIndex < rules.size(); ruleIndex++) {
							AssetGroupException assetGroupException = new AssetGroupException();
							assetGroupException.setGroupName(assetGroupExceptionDetails.getAssetGroup().trim());
							assetGroupException.setTargetType(targetTypes.get(targetIndex).getTargetName().trim());
							assetGroupException.setDataSource(assetGroupExceptionDetails.getDataSource().trim());
							assetGroupException.setExceptionName(assetGroupExceptionDetails.getExceptionName().trim());
							assetGroupException.setExceptionReason(assetGroupExceptionDetails.getExceptionReason().trim());
							assetGroupException.setExpiryDate(AdminUtils.getFormatedDate("dd/MM/yyyy", assetGroupExceptionDetails.getExpiryDate()));
							assetGroupException.setRuleId(rules.get(ruleIndex).getId().trim());
							assetGroupException.setRuleName(rules.get(ruleIndex).getText().trim());
							ruleIds.add(rules.get(ruleIndex).getId().trim());
							allAssetGroupExceptions.add(assetGroupException);
							haveNoRules = false;
						}
						
					}
					if(targetTypes.size()==0 || haveNoRules) {
						AssetGroupException assetGroupException = new AssetGroupException();
						assetGroupException.setGroupName(assetGroupExceptionDetails.getAssetGroup().trim());
						assetGroupException.setTargetType(StringUtils.EMPTY);
						assetGroupException.setDataSource(assetGroupExceptionDetails.getDataSource().trim());
						assetGroupException.setExceptionName(assetGroupExceptionDetails.getExceptionName().trim());
						assetGroupException.setExceptionReason(assetGroupExceptionDetails.getExceptionReason().trim());
						assetGroupException.setExpiryDate(AdminUtils.getFormatedDate("dd/MM/yyyy", assetGroupExceptionDetails.getExpiryDate()));
						assetGroupException.setRuleId(StringUtils.EMPTY);
						assetGroupException.setRuleName(StringUtils.EMPTY);
						allAssetGroupExceptions.add(assetGroupException);
					}

					assetGroupExceptionRepository.saveAll(allAssetGroupExceptions);
					if(targetTypes.size()!=0 && !haveNoRules) {
						invokeAllRules(ruleIds);
					}
					return CONFIG_STICKY_EXCEPTION_SUCCESS;
				} catch (Exception e) {
					invokeAPI("DELETE", "/exceptions/sticky_exceptions/"+ assetGroupExceptionDetails.getExceptionName().replaceAll(" ", "_"), null);
					throw new PacManException("Exception while updating to table " + e.getMessage());
				}
			} else {
				throw new PacManException("Exception while updating to ES");
			}
		} catch (Exception exception) {
			log.error(UNEXPECTED_ERROR_OCCURRED, exception);
			throw new PacManException(UNEXPECTED_ERROR_OCCURRED);
		}
	}

}