package NFP.Algorithms;

import java.util.List;

import seg.jUCMNav.nfp.generated.*;

public class AggregateJurisdiction {

	private List<Jurisdiction> Jurisdictions;
	private Jurisdiction aggregatedJurisdiction;
	
	public Jurisdiction getAggregateJurisdiction(List<Jurisdiction> Jurisdictions){
		this.Jurisdictions=Jurisdictions;
		initialize();
		for (Jurisdiction Jur : this.Jurisdictions) {
			aggregatedJurisdiction = CountryIntersection(aggregatedJurisdiction,Jur);
			for (Country aggregatedCountry : aggregatedJurisdiction.getCountries()) {
				Country c = new Country();
				for(Country ac : Jur.getCountries()){
					if(aggregatedCountry.getCode() == ac.getCode()){
						c = ac;
						break;
					}
				}
				if(!aggregatedCountry.getTerritories().isEmpty() & !c.getTerritories().isEmpty()){
					aggregatedCountry.getTerritories().retainAll(c.getTerritories());
					if(aggregatedCountry.getTerritories().isEmpty()){
						aggregatedJurisdiction.getCountries().remove(aggregatedCountry);
					}
				}
				else
				{
					for(Territory tr : c.getTerritories()){
						if(!aggregatedCountry.getTerritories().contains(tr))
							aggregatedCountry.getTerritories().add(tr);
					}
				}
			}
		}
		return aggregatedJurisdiction;
	}

	private Jurisdiction CountryIntersection(Jurisdiction first, Jurisdiction second){
		Jurisdiction result = new Jurisdiction();
		for(Country c1 : first.getCountries()){
			for(Country c2 : second.getCountries()){
				if(c1.getCode()==c2.getCode())
					result.getCountries().add(c1);
			}
		}
		return result;
	}
	
	private void initialize() {
		aggregatedJurisdiction= new Jurisdiction();
		aggregatedJurisdiction= Jurisdictions.get(0);
	}
}
