package rules;



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.TopiaContext;

import org.codelutin.util.StringUtil;



import fr.ifremer.isisfish.IsisFishDAOHelper;

import fr.ifremer.isisfish.simulator.PopulationMonitor;

import fr.ifremer.isisfish.simulator.SimulationContext;

import fr.ifremer.isisfish.types.Date;

import fr.ifremer.isisfish.types.Month;

import fr.ifremer.isisfish.entities.*;

import fr.ifremer.isisfish.rule.AbstractRule;

import fr.ifremer.isisfish.datastore.SimulationStorage;

import fr.ifremer.isisfish.datastore.ResultStorage;



/**

  * RecrutementLangoustine.java

  *

  * Created: 22 mars 2007

  *

  * @author stephanie MAHEVAS <smahevas@ifremer.fr>

  * @version $Revision: 1.1 $

  *

  * Last update: $Date: 2007/03/22 17:33:56 $

  * by : $Author: bpoussin $

  */

public class RecrutementLangoustine extends AbstractRule {



     /** to use log facility, just put in your code: log.info("..."); */

     static private Log log = LogFactory.getLog(RecrutementLangoustine.class);



     public double param_recrut1998 =0;

     public double param_recrut1999 =0;

     public double param_recrut2000 =0;

     public double param_recrut2001 =0;

     public double param_recrut2002 =0;

     public double param_recrut2003 =0;

     public double param_recrut2004 =0;

     public double param_recrut2005 =0;



     public double [] recru = null;

     

     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 la regle.

      * @return L'aide ou la description de la regle

      */

     public String getDescription() throws Exception {

         // TODO

         return _("TODO description rule");

     }



     /**

      * 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(SimulationContext context) throws Exception {

         // remarque on pourrait aussi avoir un seul parametre de regle

         // par exemple param_recru_depuis_1998 = "0;0;0;0;0;0;0;0";

         // on ferait alors

         // recru = StringUtil.toArrayDouble(param_recru_depuis_1998.split(";")); 

         

         recru = new double[]{

                 param_recrut1998,

                 param_recrut1999,

                 param_recrut2000,

                 param_recrut2001,

                 param_recrut2002,

                 param_recrut2003,

                 param_recrut2004,

                 param_recrut2005,

         };

     }

     /**

      * La condition qui doit etre vrai pour faire les actions

      * @param simulation La simulation pour lequel on utilise cette regle

      * @return vrai si on souhaite que les actions soit faites

      */

     public boolean condition(SimulationContext context, Date date, Metier metier) throws Exception {

         boolean result = false;

         if (date.getMonth().equals(Month.SEPTEMBER) || 

                 date.getMonth().equals(Month.OCTOBER)

                 || date.getMonth().equals(Month.NOVEMBER) 

                 ||date.getMonth().equals(Month.DECEMBER)) {

             result = true;

         }

         return result;

/*

writeln("recrutement CIEM");

var mois = p.date.getMois().getNumMois();

//si le recrutement a lieu en octobre

if( mois==8 ||mois==9 || mois==10 || mois==11){

//??&& p.oprfaite==false{

var result = true;

}

   return result ;

*/



     }



     /**

      * Si la condition est vrai alors cette action est execut�e avant 

le pas

      * de temps de la simulation.

      * @param simulation La simulation pour lequel on utilise cette regle

      */

     public void preAction(SimulationContext context, Date date, Metier metier) throws Exception {

         TopiaContext db = context.getDB();

         

         PopulationDAO popDao = IsisFishDAOHelper.getPopulationDAO(db);

         Population pop = popDao.findByName("nephrops");

         PopulationGroup group0 = pop.getPopulationGroup().get(0);

         

         ZoneDAO zoneDao = IsisFishDAOHelper.getZoneDAO(db);

         Zone zone1 = zoneDao.findByName("zone L21E7");

         Zone zone2 = zoneDao.findByName("zone L21E8");

         Zone zone3 = zoneDao.findByName("zone L22E6");

         Zone zone4 = zoneDao.findByName("zone L22E7");

         Zone zone5 = zoneDao.findByName("zone L23E5");

         Zone zone6 = zoneDao.findByName("zone L23E6");

         Zone zone7 = zoneDao.findByName("zone L23E7");

         Zone zone8 = zoneDao.findByName("zone L24E5");

         Zone zone9 = zoneDao.findByName("zone L24E6");



         int year = date.getYear();

         MatrixND matN = context.getPopulationMonitor().getN(pop);



         double coefR =4/(Math.exp(-0.6/12))*(1+ Math.exp(-0.3/12)+ Math.exp(-0.6/12)+ Math.exp(-0.9/12));



         double R = recru[year] * coefR / 9.0;



         matN.setValue(group0, zone1, R);

         matN.setValue(group0, zone2, R);

         matN.setValue(group0, zone3, R);

         matN.setValue(group0, zone4, R);

         matN.setValue(group0, zone5, R);

         matN.setValue(group0, zone6, R);

         matN.setValue(group0, zone7, R);

         matN.setValue(group0, zone8, R);

         matN.setValue(group0, zone9, R);



     }



     /**

      * Si la condition est vrai alors cette action est execut�e apres le pas

      * de temps de la simulation.

      * @param simulation La simulation pour lequel on utilise cette regle

      */

     public void postAction(SimulationContext context, Date date, Metier metier) throws Exception {

         // TODO

     }



}

