package analyseplans;

import static org.codelutin.i18n.I18n._;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

import scripts.ResultName;

import java.io.Writer;

import org.codelutin.math.matrix.*;
import org.codelutin.topia.*;// pour pouvoir utiliser la methode StringUtil.toDouble()
import org.codelutin.util.*;// pour pouvoir utiliser la methode StringUtil.toDouble()


import fr.ifremer.isisfish.*;
import fr.ifremer.isisfish.simulator.SimulationContext;
import fr.ifremer.isisfish.types.*;
import fr.ifremer.isisfish.entities.*;
import fr.ifremer.isisfish.simulator.AnalysePlan;
import fr.ifremer.isisfish.simulator.AnalysePlanContext;
import fr.ifremer.isisfish.simulator.SimulationParameter;
import fr.ifremer.isisfish.datastore.SimulationStorage;
import fr.ifremer.isisfish.datastore.ResultStorage;

/**
 * CalibrationLangoustine2param.java
 *
 * Created: 14 mai 2007
 *
 * @author stephanie MAHEVAS <smahevas@ifremer.fr>
 * @version $Revision: 1.26 $
 *
 * Last update: $Date: 2007/03/09 14:10:40 $
 * by : $Author: bpoussin $
 */
public class CalibrationLangoustineq1 implements AnalysePlan {

    /** to use log facility, just put in your code: log.info("..."); */
    static private Log log = LogFactory.getLog(CalibrationLangoustineq1.class);

    public Population param_Population = null;

    public String param_q1 = "1e-5;1e-6;1e-7";// devient un parametre du plan d analyse
    public String [] valparamq1 = param_q1.split(";"); 
    double [] valq1 = StringUtil.toArrayDouble(valparamq1);
    public String [] necessaryResult = {
    // put here all necessary result for this rule
    // example:
    // ResultName.MATRIX_BIOMASS,
    // ResultName.MATRIX_NET_VALUE_OF_LANDINGS_PER_STRATEGY_MET,
    };

    public String[] getNecessaryResult() {
        return this.necessaryResult;
    }

    /**
     * Permet d'afficher a l'utilisateur une aide sur le plan.
     * @return L'aide ou la description du plan
     */
    public String getDescription() throws Exception {
        // TODO
        return _("Calibrate Nephrops fishery using a list of q1 values (q2=q1/10) separated by ;");
    }

    /**
     * Appel� au d�marrage de la simulation, cette m�thode permet d'initialiser
     * des valeurs
     * @param simulation La simulation pour lequel on utilise cette regle
     */
    public void init(AnalysePlanContext context) throws Exception {
       

    }

    
    /**
     * Call before each simulation
     * @param context plan context
     * @param nextSimulation storage used for next simulation
     * @return true if we must do next simulation, false to stop plan
     * @throws Exception
     */
    public boolean beforeSimulation(AnalysePlanContext context, SimulationStorage nextSimulation) throws Exception {
         int number = context.getNumber();   // nuemro de l'experience en cours
         if (number < valq1.length) {
	    	TopiaContext db = nextSimulation.getStorage().beginTransaction();//ouvrir un context pour modifier les donnees
	    	PopulationDAO popDAO = IsisFishDAOHelper.getPopulationDAO(db);
     	  	Population pop = popDAO.findByTopiaId(param_Population.getTopiaId());
 //		autre solution moins efficace et moins sure:  Population Nephrops = dao.findByName(param_Population.getName());
    	  	MatrixND c = pop.getCapturability();
    
     	  	for (MatrixIterator i = c.iterator(); i.hasNext();){
		    	i.next();
                double valq2;
	    	  	Object [] sem = i.getSemanticsCoordinates();
		    	PopulationGroup group = (PopulationGroup)sem[0];
		    	PopulationSeasonInfo season = (PopulationSeasonInfo)sem[1];
		  	    if (season.getFirstMonth().after(Month.JULY) && group.getId() >=18){ //mois >= aout
                    valq2=valq1[number]/10;
		     		i.setValue(valq2);
      		    }
		     	else {
		  	    	i.setValue(valq1[number]);
		     	}
		    }
           db.commitTransaction(); //applique les modifs
           db.closeContext();//indique la fin des modifs
           return true;
          } else {
           return false;
          }
    }
    public boolean afterSimulation(AnalysePlanContext context, SimulationStorage lastSimulation) throws Exception {
        
        return true;
    }


   

}
