//attention: cette rgle de gestion ne fonctionne que si la fermeture a lieu pour toutes
//les annes de simulation


var nomZone="RP"; //entrez le nom de la zone ferme
var engin="non";//entrez le nom de l'engin ferme ou non si pas de slection sur engin
var moisDeb=0; //entrez le mois debut de fermeture
var moisFin=11;//entrez le mois de fin de fermeture



var ZoneFermee=SecteurFactory.findByNom(nomZone);
if (engin!="non") {var EnginInterdit=EnginFactory.findByNom(engin);} else {var EnginInterdit=MetierFactory.findByNom("nonActivite").getEngin();}
var RegionSimu=ZoneFermee.getRegion();
var ListeMetiers=MetierFactory.findAllByRegion(RegionSimu);
var MoisDeb=new Packages.fr.ifremer.nodb.Mois(moisDeb);
var MoisFin=new Packages.fr.ifremer.nodb.Mois(moisFin);
var SaisonFermee= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin);
var metChomage = MetierFactory.findByKey("nonActivite", RegionSimu);



for (var imetier = ListeMetiers.iterator() ; imetier.hasNext();){
	var metier=imetier.next();
	writeln ("metier examin "+metier.getNom());
	if ((!metier.getEngin().equals(EnginInterdit)) && engin!="non"){
		writeln("l engin du mtier n est pas concern");
	}
	else {
		writeln("l engin du mtier est bien concern");
		var ListeSaisons = metier.getInfoSaison();
		for (var isaisonmetier = ListeSaisons.iterator() ; isaisonmetier.hasNext();){
			var saisonmetier=isaisonmetier.next();
			var maillefermee=ZoneFermee.getMaille();
			var MailleMetier=saisonmetier.getSecteur().getMaille().copy();
			MailleMetier.retainAll(maillefermee);
			
			if (MailleMetier.size()!=0){
				MailleMetier=saisonmetier.getSecteur().getMaille().copy();
				var saison=saisonmetier.getSaison();
				if (saison.contains(SaisonFermee)){
					writeln("il y a bien intersection entre la zone mtier et le cantonnement pour la saison "+saison.toString());
// calcule de la zone restante:		
					var ToutFerme=false;
					var DebInclus=saison.contains(MoisDeb);
					var FinInclus=saison.contains(MoisFin);
					MailleMetier.removeAll(maillefermee);
					writeln("inter maille:"+MailleMetier.size());
					// test pour savoir si toute la zone de pratique du metier
					// (reunion de toutes les zones metiers  de metier a date)
					// est totalement incluse dans la zone Cantonnement
					
					if (MailleMetier.size() != 0){ //le cas intersection.length==mailleMetier est dans condition
					  // si toute la zone de pratique du metier n'est pas incluse dans zone Cantonnement
	
					  //creation du nouveau secteur de metier
						ToutFerme=false;
						var secteurResult = MetaSecteurFactory.create("MetaCantonnement-"+metier.getNom()+saison.toString(), RegionSimu, "Secteur cr durant la simulation.");
						writeln("nouveau secteur cree:"+secteurResult);
						var zonesMetier = saisonmetier.getSecteur().getAllSecteur();
						writeln("zonesMetier:"+zonesMetier);
						writeln("zonesMetier.size:"+zonesMetier.size());

						for(var i=0; i<zonesMetier.size(); i++){
							var zonemet = zonesMetier.get(i);
							writeln("zonemet:"+zonemet);
							// intersection entre la zeme zone metier a date et zone de Cantonnement
							var listemailleszonemetier = zonemet.getMaille().copy();
							var nbMailleZoneMetier = listemailleszonemetier.size();
							writeln("maille metier:"+listemailleszonemetier);
							writeln("maille Cantonnement:"+maillefermee);
							listemailleszonemetier.removeAll(maillefermee);
							if(0==listemailleszonemetier.size()){
								//si completement inclus on le supprime
								//donc on ne le met pas dans le nouveau
								writeln("on supprime la zone"+zonemet);
							}
							else if (listemailleszonemetier.size() != nbMailleZoneMetier) {
								// si la zone metier n'est pas totalement incluse dans zone de Cantonnement
								// on reduit  la zeme zone metier de cette intersection
								// pas de modif de la matrice de proportion strmet
								writeln("on cree une nouvelle zone a partir de:"+zonemet+" avec "+listemailleszonemetier);
								var simpleSecteur = SecteurSimpleFactory.create("Cantonnement-"+metier.getNom()+"-"+zonemet+saison.toString(), RegionSimu, "Secteur creer durant la simulation.");
								simpleSecteur.addAllMaille(listemailleszonemetier);
								secteurResult.addSecteur(simpleSecteur);
								writeln("apres addSecteur");  
							}
							else {
								//sinon on le met dans le nouveau
								writeln("On remet tel quelle la zone:"+zonemet);
								secteurResult.addSecteur(zonemet);
							}
						}// fin du for sur les zone metier de la zone de pratique du metier
					}  
	
					else {
						var secteurResult=saisonmetier.getSecteur().getAllSecteur();
						writeln("Toute la zone metier est ferme");
						ToutFerme=true;
					}

//1er cas: la saison mtier est identique (ou totalement incluse dans la saison ferme, dans ce cas l, on change juste
//le secteur
					if (SaisonFermee.toListMois().containsAll(saison.toListMois())){
						writeln("toute la saison metier est incluse dans la saison de fermeture");
						//si tout est ferm, on met le metier au chmage
						
						if (ToutFerme==true){
							writeln ("toute la zone est ferme, le metier passe donc  chmage pour cette saison");
							var listestrategies=StrategyFactory.findAllByRegion(RegionSimu);
							var ListeMois=saison.toListMois();
							for(var i=0; i<listestrategies.size(); i++){
								var SetOfBateau=listestrategies.get(i).getSetOfVessels();
								var MetiersPosibles=SetOfBateau.getMetiers();
								if (MetiersPosibles.contains(metier)){
									for (imois=ListeMois.iterator();imois.hasNext();){
										var mois=imois.next();
										var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois);
										InfoMois.setProportionMetier(metChomage,new Packages.java.lang.Float(InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)));
										InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0));
										MetiersInterditsPresimu.put(InfoMois.getPropStrMetier(metier),true);
									}
								}
							}
						}
						else {
							writeln("tout n'est pas ferme, le secteur de pche devient "+secteurResult);
							var ListeMois=SaisonFermee.toListMois();
							for (imois=ListeMois.iterator();imois.hasNext();){
								mois=imois.next();
								metier.setSecteurMois(secteurResult, mois);
							}
						}
					}

//2me cas de figure: moisDeb est inclus mais pas moisFin (ou alors c'est le dernier mois)
					else if (DebInclus && ((!FinInclus) || moisFin==saison.getLastMois().getNumMois())){
						writeln ("il y a intersection de la saison de fermeture avec la saison mtier de "+moisDeb+"  "+saison.getLastMois().getNumMois());
						//si tout est ferm on met les proportions  0 pour les mois fermes
						if (ToutFerme==true){
							writeln ("toute la zone mtier est ferme");
							var listestrategies=StrategyFactory.findAllByRegion(RegionSimu);
							var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois());
							writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage");
							for(var i=0; i<listestrategies.size(); i++){
								var SetOfBateau=listestrategies.get(i).getSetOfVessels();
								var MetiersPosibles=SetOfBateau.getMetiers();
								if (MetiersPosibles.contains(metier)){
									for (imois=ListeMois.iterator();imois.hasNext();){
										var mois=imois.next();
										var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois);
										InfoMois.setProportionMetier(metChomage,new Packages.java.lang.Float(InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)));
										InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0));
										MetiersInterditsPresimu.put(InfoMois.getPropStrMetier(metier),true);
									}
								}
							}
						}
						else {
							//on commence par cre les nouvelles saisons
							var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,saison.getLastMois().getNumMois());		
							var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1);
							saisonmetier.setSaison(NouvelleSaison1);		
							//on cre un nouveau  infoSaisonMetier
							var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison cre pendant la simulation") ;
							metier.addInfoSaison(NouvelInfoSaison);
							writeln ("de "+saison.getFirstMois().getNumMois()+"  "+moisDeb-1+" le metier peche en "+saisonmetier.getSecteur());
							writeln ("de "+moisDeb+"  "+saison.getLastMois().getNumMois()+" le metier peche en "+secteurResult);
						}
					}
//3me cas de figure: moisFin est inclus mais pas moisDeb (ou alors il est gal au premier mois)
					else if (((!DebInclus) || moisDeb==saison.getFirstMois().getNumMois()) && FinInclus){
						writeln ("il y a intersection de la saison de fermeture avec la saison mtier de "+moisDeb+"  "+saison.getLastMois().getNumMois());
						//si tout est ferm on met les proportions  0 pour les mois fermes
						if (ToutFerme==true){
							writeln ("toute la zone est fermee");
							var listestrategies=StrategyFactory.findAllByRegion(RegionSimu);
							var ListeMois=SaisonFermee.toListMois().retainAll(saison.toListMois());
							writeln ("de "+ListeMois.get(0)+" a "+ ListeMois.get(ListeMois.size())+ ", le metier est donc mis au chomage");
							for(var i=0; i<listestrategies.size(); i++){
								var SetOfBateau=listestrategies.get(i).getSetOfVessels();
								var MetiersPosibles=SetOfBateau.getMetiers();
								if (MetiersPosibles.contains(metier) ){
									for (imois=ListeMois.iterator();imois.hasNext();){
										var mois=imois.next();
										var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois);
										InfoMois.setProportionMetier(metChomage,new Packages.java.lang.Float(InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(metier)));
										InfoMois.setProportionMetier(metier,new Packages.java.lang.Float(0));
										MetiersInterditsPresimu.put(InfoMois.getPropStrMetier(metier),true);
									}
								}
							}
						}
						else {
							//on commence par cre les nouvelles saisons 
							var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisFin);		
							var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois.getNumMois());
							saisonmetier.setSaison(NouvelleSaison2);		
							//on cre un nouveau  infoSaisonMetier
							var NouvelInfoSaison=InfoSaisonMetierFactory.create(metier, NouvelleSaison1, secteurResult, "saison cre pendant la simulation") ;
							metier.addInfoSaison(NouvelInfoSaison);
							writeln ("de "+saison.getFirstMois().getNumMois()+"  "+moisFin+" le metier peche en "+secteurResult);
							writeln ("de "+moisFin+1+"  "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur());
						}
					}

//dernier cas de figure: les deux sont inclus et sont diffrents des bornes
					else {
						//si tout est ferm on met les proportions  0 pour les mois fermes
						if (ToutFerme==true){
							writeln("toute la zone mtier est ferme");
							var listestrategies=StrategyFactory.findAllByRegion(p.metier.getRegion());
							var ListeMois=SaisonFermee.toListMois();
							writeln("le mtier passe  chmage de "+moisDeb+"  "+moidFin);
							for(var i=0; i<listestrategies.size(); i++){
								var SetOfBateau=listestrategies.get(i).getSetOfVessels();
								var MetiersPosibles=SetOfBateau.getMetiers();
								if (MetiersPosibles.contains(metier) ){
									for (imois=ListeMois.iterator();imois.hasNext();){
										var mois=imois.next();
										var InfoMois=listestrategies.get(i).getStrategyMonthInfo(mois);
										InfoMois.setProportionMetier(metChomage,new Packages.java.lang.Float(InfoMois.getProportionMetier(metChomage)+InfoMois.getProportionMetier(p.metier)));
										InfoMois.setProportionMetier(p.metier,new Packages.java.lang.Float(0));
										MetiersInterditsPresimu.put(InfoMois.getPropStrMetier(metier),true);
									}
								}
							}
						}
						else {
							//on commence par cre les nouvelles saisons
							var NouvelleSaison1= new Packages.fr.ifremer.nodb.Saison(saison.getFirstMois().getNumMois(),moisDeb-1);		
							var NouvelleSaison2= new Packages.fr.ifremer.nodb.Saison(moisDeb,moisFin);
							var NouvelleSaison3=new Packages.fr.ifremer.nodb.Saison(moisFin+1,saison.getLastMois().getNumMois());
							saisonmetier.setSaison(NouvelleSaison1);		
							//on cre 2 nouveau  infoSaisonMetier
							var NouvelInfoSaison2=InfoSaisonMetierFactory.create(metier, NouvelleSaison2, secteurResult, "saison cre pendant la simulation") ;
							var NouvelInfoSaison3=InfoSaisonMetierFactory.create(metier, NouvelleSaison3, saisonmetier.getSecteur(), "saison cre pendant la simulation") ;
							metier.addInfoSaison(NouvelInfoSaison2);
							metier.addInfoSaison(NouvelInfoSaison3);							
							writeln ("de "+saison.getFirstMois().getNumMois()+"  "+(moisDeb-1)+" le metier peche en "+saisonmetier.getSecteur());
							writeln ("de "+moisDeb+"  "+moisFin+" le metier peche en "+secteurResult);
							writeln ("de "+(moisFin+1)+"  "+saison.getLastMois().getNumMois()+" le metier peche en "+saisonmetier.getSecteur());
						}
					}
				}
			}
		}
	}
}