package scripts;

import java.util.*;
import java.io.*;

import org.nuiton.topia.TopiaContext;

import org.nuiton.math.matrix.MatrixIterator;
import org.nuiton.math.matrix.MatrixND;
import org.nuiton.math.matrix.*;

import fr.ifremer.isisfish.entities.*;
import fr.ifremer.isisfish.datastore.RegionStorage;
import fr.ifremer.isisfish.IsisFishDAOHelper;

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

import fr.ifremer.isisfish.ui.simulator.SimulatorContext;


/**
 * remplir target factor (il existe une option pour mettre 1 partout)
 *
 * Auteur: PHAN Tuan Anh, 2022
 */
public class FillTargetFactor {

    private static Log log = LogFactory.getLog(FillTargetFactor.class);
   
    protected File myTFfile = new File("/home/chatellier/projets/ifremer-isisfish/userdata/antoine/myTFfile.txt");
    
	/** les objets pour manipuler objets isis */ 
	protected TopiaContext myTX;
	protected List<Metier> myListMetiers;
	protected List<Species> myListSpecies;
	protected TargetSpeciesDAO myTsDAO;

	// public FillTargetFactor() {} // exception cause by reading csv file
	/** lancer le script dans isis */
	public static void main(String[] args) throws Exception {
		System.out.println("~~~ Start: " + new Date() + " ~~~" + System.lineSeparator());
		FillTargetFactor script = new FillTargetFactor();
		script.run();
		System.out.println("~~~  Done: " + new Date() + " ~~~");
	}
   
	/** vrai lancement du script car main() accepte pas ces fx */
	public void run() throws Exception {
        myTX = RegionStorage.getRegion("MACCO_BoB_MixFish_TargetFactors_21avr2023").getStorage().beginTransaction();
        myListMetiers = IsisFishDAOHelper.getMetierDAO(myTX).findAll();
        myListSpecies = IsisFishDAOHelper.getSpeciesDAO(myTX).findAll();
        myTsDAO = IsisFishDAOHelper.getTargetSpeciesDAO(myTX);

        SimulatorContext.setDb(myTX);
    
		setTargetFactor();

		// save the changes
		myTX.commitTransaction();
		myTX.closeContext();
	}

	/** cœur de ce script */
	protected void setTargetFactor() throws Exception {
		System.out.println("remplir target factor pour tous engins + espèces");
        
        MatrixND matrixTargetFactors = MatrixFactory.getInstance().create(myTFfile);
        log.warn("  > matrixTargetFactors: " + matrixTargetFactors);
		// System.out.println(matrixTargetFactors);
		for (Metier metier : myListMetiers) {
			//log.warn("  > metier: " + metier.getName());
			List<MetierSeasonInfo> msis = metier.getMetierSeasonInfo();
			for (MetierSeasonInfo msi : msis) {
				for (Species sp : myListSpecies) {
					//log.warn("    > species: " + sp.getName());
				   remplirTF(msi, metier, sp, matrixTargetFactors);
                 // remplirTF(msi, metier, sp);
				}
			}
		}
		System.out.println(System.lineSeparator());
	}

	private void remplirTF(MetierSeasonInfo msi, Metier metier, Species sp, MatrixND matrixTargetFactors) throws Exception {
    // private void remplirTF(MetierSeasonInfo msi, Metier metier, Species sp) throws Exception {    
     //   System.out.println(matrixTargetFactors);
      //  System.out.println("    > species: " + sp.getName());
      //  System.out.println("  > metier: " + metier.getName());
        
        //MatrixND matrixTargetFactors = MatrixFactory.getInstance().create(myTFfile);
		 double tf = matrixTargetFactors.getValue(metier, sp);
		// double tf = 0;
		System.out.println("      + tf: " + tf);
		String eq = "return "+ tf + ";";

		// check if there is any already equation
		TargetSpecies ts = msi.getSpeciesTargetSpecies(sp);
		if (ts != null) {
			System.out.println("      + modif");
			ts.getTargetFactorEquation().setContent(eq);
			ts.update();
		} else { // if not registered yet then make it
			System.out.println("      + new");
			TargetSpecies new_ts = myTsDAO.create();
			new_ts.getTargetFactorEquation().setContent(eq);
			new_ts.setSpecies(sp) ;
			new_ts.update();
			msi.addSpeciesTargetSpecies(new_ts);
			msi.update();
		}
	}

}
