class VulnerabilityRepository implements Constants {

	public List<Map<String, Object>> getVulnerabilyAcrossAppAndEnv(String assetGroup, String filter, String application,
			String parentType, String severity) throws Exception {

		List<Map<String, Object>> vulnApplications = new ArrayList<>();
		StringBuilder urlToQuery = new StringBuilder(esUrl).append("/").append(assetGroup);
		urlToQuery.append("/").append(parentType);
		urlToQuery.append("/").append(SEARCH);

		StringBuilder requestBody = new StringBuilder(
				"{\"size\":0,\"query\":{\"bool\":{\"must\":[{\"match\":{\"latest\":true}}");
		if (StringUtils.isNotEmpty(application)) {
			requestBody.append(",{\"match\":{\"tags.Application.keyword\":\"");
			requestBody.append(application);
			requestBody.append("\"}}");
		}
		requestBody.append("]}},\"aggs\":{\"apps\":{\"terms\":{\"field\":\"");
		requestBody.append(filter);
		requestBody.append(
				"\",\"size\":10000},\"aggs\":{\"vulns\":{\"children\":{\"type\":\"vulninfo\"},\"aggs\":{\"NAME\":{\"filters\":{\"filters\":{\"");
		if (StringUtils.isNotEmpty(severity)) {
			requestBody.append("S").append(severity);
			requestBody.append("\":{\"bool\":{\"must\":[{\"match\":{\"latest\":true}},{\"term\":{\"severitylevel.keyword\":")
					.append(severity).append("}}]}}");
		} else {
			requestBody.append(
					"S3\":{\"bool\":{\"must\":[{\"term\":{\"severitylevel.keyword\":3}},{\"match\":{\"latest\":true}}]}},\"S4\":{\"bool\":{\"must\":[{\"term\":{\"severitylevel.keyword\":4}},{\"match\":{\"latest\":true}}]}},\"S5\":{\"bool\":{\"must\":[{\"term\":{\"severitylevel.keyword\":5}},{\"match\":{\"latest\":true}}]}}");
		}
		requestBody.append("}}}}}}}}}");
		String responseJson = "";
		try {
			responseJson = PacHttpUtils.doHttpPost(urlToQuery.toString(), requestBody.toString());
		} catch (Exception e) {
			LOGGER.error("Error in getVulnerabilyAcrossAppAndEnv from ES", e);
			throw e;
		}
		JsonParser jsonParser = new JsonParser();
		JsonObject resultJson = (JsonObject) jsonParser.parse(responseJson);
		JsonObject aggsJson = (JsonObject) jsonParser.parse(resultJson.get(AGGREGATIONS).toString());
		JsonArray outerBuckets = aggsJson.getAsJsonObject("apps").getAsJsonArray(BUCKETS);
		if (outerBuckets.size() > 0) {
			for (int i = 0; i < outerBuckets.size(); i++) {
				String appName = outerBuckets.get(i).getAsJsonObject().get("key").getAsString();
				List<Map<String, Object>> severityInfo = getSeverityInfo(outerBuckets.get(i).getAsJsonObject()
						.getAsJsonObject(VULN).getAsJsonObject("NAME").getAsJsonObject(BUCKETS), severity);
				Map<String, Object> applicationInfo = new HashMap<>();
				if (filter.equals(TAGS_APPS)) {
					applicationInfo.put(APPS, appName);
				} else {
					applicationInfo.put("environment", appName);
				}
				applicationInfo.put("severityinfo", severityInfo);
				if (StringUtils.isEmpty(severity)) {
					applicationInfo.put(VULNEREBILITIES,
							Integer.valueOf(severityInfo.get(0).get(COUNT).toString())
									+ Integer.valueOf(severityInfo.get(1).get(COUNT).toString())
									+ Integer.valueOf(severityInfo.get(2).get(COUNT).toString()));
				} else {
					applicationInfo.put(VULNEREBILITIES, Integer.valueOf(severityInfo.get(0).get(COUNT).toString()));
				}
				vulnApplications.add(applicationInfo);
			}
		}
		return vulnApplications;
	}

}