class InventoryUtil {

	@SuppressWarnings("rawtypes")
	public static Map<String,List<VpcVH>> fetchVpcInfo(BasicSessionCredentials temporaryCredentials, String skipRegions,String accountId,String accountName) {
		Map<String,List<VpcVH>> vpcMap = new LinkedHashMap<>();

		String expPrefix = InventoryConstants.ERROR_PREFIX_CODE+accountId + "\",\"Message\": \"Exception in fetching info for resource in specific region\" ,\"type\": \"Vpc\" , \"region\":\"" ;
		for(Region region : RegionUtils.getRegions()){
			try{
				if(!skipRegions.contains(region.getName())){
					List<VpcVH> vpcList = new ArrayList<>();
					AmazonEC2 ec2Client = AmazonEC2ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(temporaryCredentials)).withRegion(region.getName()).build();
					List<Vpc> tmpVpcList = ec2Client.describeVpcs().getVpcs();
					tmpVpcList.stream().forEach(vpc -> {
						VpcVH vpcVH = new VpcVH();
						vpcVH.setVpc(vpc);
						List<VpcEndpoint> vpcEndPoints = ec2Client.describeVpcEndpoints(new DescribeVpcEndpointsRequest().withFilters(new Filter("vpc-id",Arrays.asList(vpc.getVpcId())))).getVpcEndpoints();
						List<VpcEndPointVH> vpcEndPointsList = new ArrayList<>();
						vpcEndPoints.stream().forEach(vpcEndPoint -> {
							VpcEndPointVH  vpcEndPointVH = new VpcEndPointVH(vpcEndPoint);
							vpcEndPointVH.setPublicAccess(false);
							ObjectMapper mapper = new ObjectMapper();
							Map<String, Object> policyDoc = new HashMap<>();
							try {
								policyDoc = mapper.readValue(vpcEndPoint.getPolicyDocument(), new TypeReference<Map<String, Object>>(){});
								Map statement = (Map)((ArrayList)policyDoc.get("Statement")).get(0);
								if(statement.get("Effect").equals("Allow") && statement.get("Resource").equals("*")) {
									vpcEndPointVH.setPublicAccess(true);
								}
							} catch (Exception e) {
								log.error(expPrefix+ region.getName()+InventoryConstants.ERROR_CAUSE +e.getMessage()+"\"}");
							}
							vpcEndPointsList.add(vpcEndPointVH);
						});
						vpcVH.setVpcEndPoints(vpcEndPointsList);
						vpcList.add(vpcVH);
					});
					if(!vpcList.isEmpty()) {
						log.debug(InventoryConstants.ACCOUNT + accountId +" Type : VPC "+region.getName() + " >> "+vpcList.size());
						vpcMap.put(accountId+delimiter+accountName+delimiter+region.getName(),vpcList);
					}
				}
			}catch(Exception e){
				log.warn(expPrefix+ region.getName()+InventoryConstants.ERROR_CAUSE +e.getMessage()+"\"}");
				ErrorManageUtil.uploadError(accountId,region.getName(),"VPC",e.getMessage());
			}
		}
		return vpcMap;
	}

	private  InventoryUtil();

}