class InventoryUtil {

	public static Map<String,List<ClassicELBVH>> fetchClassicElbInfo(BasicSessionCredentials temporaryCredentials, String skipRegions,String accountId,String accountName){

		Map<String,List<ClassicELBVH>> elbList = new LinkedHashMap<>();
		String expPrefix = InventoryConstants.ERROR_PREFIX_CODE+accountId + "\",\"Message\": \"Exception in fetching info for resource in specific region\" ,\"type\": \"Classic ELB\" , \"region\":\"" ;
		for(Region region : RegionUtils.getRegions()){
			try{
				if(!skipRegions.contains(region.getName())){
					AmazonElasticLoadBalancing elbClient = AmazonElasticLoadBalancingClientBuilder.standard().
							 	withCredentials(new AWSStaticCredentialsProvider(temporaryCredentials)).withRegion(region.getName()).build();
					String nextMarker = null;
					List<LoadBalancerDescription> elbListTemp = new ArrayList<>();
					com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancersResult elbDescResult ;
					do{
						elbDescResult = elbClient.describeLoadBalancers(new DescribeLoadBalancersRequest().withMarker(nextMarker));
						elbListTemp.addAll(elbDescResult.getLoadBalancerDescriptions());
						nextMarker = elbDescResult.getNextMarker();
					}while(nextMarker!=null);

					List<ClassicELBVH> classicElbList = new ArrayList<>();
					if( !elbListTemp.isEmpty() ){
						List<String> elbNames = elbListTemp.stream().map(elb -> { return elb.getLoadBalancerName();}).collect(Collectors.toList());
						List<TagDescription> tagDescriptions = new ArrayList<>();
						List<String> elbNamesTemp = new ArrayList<>();
						int i=0;
						for(String elbName : elbNames){
							i++;
							elbNamesTemp.add(elbName);
							if(i%20==0){
								tagDescriptions.addAll(elbClient.describeTags( new com.amazonaws.services.elasticloadbalancing.model.DescribeTagsRequest().withLoadBalancerNames(elbNamesTemp)).getTagDescriptions());
								elbNamesTemp = new ArrayList<>();
							}

						}
						if(!elbNamesTemp.isEmpty())
							tagDescriptions.addAll(elbClient.describeTags( new com.amazonaws.services.elasticloadbalancing.model.DescribeTagsRequest().withLoadBalancerNames(elbNamesTemp)).getTagDescriptions());

						elbListTemp.stream().forEach(elb->	{
								List<List<com.amazonaws.services.elasticloadbalancing.model.Tag>> tagsInfo =  tagDescriptions.stream().filter(tag -> tag.getLoadBalancerName().equals( elb.getLoadBalancerName())).map(x-> x.getTags()).collect(Collectors.toList());
								List<com.amazonaws.services.elasticloadbalancing.model.Tag> tags = new ArrayList<>();
								if(!tagsInfo.isEmpty())
									tags = tagsInfo.get(0);
								//****** Changes For Federated Rules Start ******
								String accessLogBucketName = "";
							    boolean accessLog = false;
							    String name = elb.getLoadBalancerName();
								if (name != null) {
									try{
										com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancing classicElbClient = com.amazonaws.services.elasticloadbalancing.AmazonElasticLoadBalancingClientBuilder.standard().
											 	withCredentials(new AWSStaticCredentialsProvider(temporaryCredentials)).withRegion(region.getName()).build();

										com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancerAttributesRequest classicELBDescReq = new com.amazonaws.services.elasticloadbalancing.model.DescribeLoadBalancerAttributesRequest().withLoadBalancerName(name) ;
										accessLogBucketName = classicElbClient.describeLoadBalancerAttributes(classicELBDescReq).getLoadBalancerAttributes().getAccessLog().getS3BucketName();
										accessLog = classicElbClient.describeLoadBalancerAttributes(classicELBDescReq).getLoadBalancerAttributes().getAccessLog().getEnabled();
									}catch(Exception e){
										// Do nothing...
									}
									
								}
								//****** Changes For Federated Rules End ******
								synchronized(classicElbList){
									classicElbList.add(new ClassicELBVH(elb,tags, accessLogBucketName, accessLog));
								}
							});
						elbList.put(accountId+delimiter+accountName+delimiter+region.getName(),classicElbList);
					}
					
					log.debug(InventoryConstants.ACCOUNT + accountId + " Type : Classic ELB "+region.getName() + " >> "+classicElbList.size());


				}
			}catch(Exception e){
				log.warn(expPrefix+ region.getName()+InventoryConstants.ERROR_CAUSE +e.getMessage()+"\"}");
				ErrorManageUtil.uploadError(accountId,region.getName(),"classicelb",e.getMessage());
			}
		}
		return elbList;
	}

	private  InventoryUtil();

}