package tests.generator;

import PIANOS.datastructures.*;
import PIANOS.exceptions.*;
import PIANOS.generator.*;
import PIANOS.io.*;

import java.util.*;

public class AcceptationTest {
	
    public static void main(String[] args) {

        test(args[0], args[1], args[2]);
    }

    public static void test(String userDistFileName, String modelFileName, String proposalFileName) {
	    DistributionFactory factory;
	    ComputationalModel model;
	    
            
            FortranWriter writer = new FortranWriter("AccTestResults2.txt");

	    try {
        	factory = new DistributionFactory(userDistFileName);
		
            model = ComputationalModelParser.modelTestOnly(modelFileName, proposalFileName, factory);
		
            ArrayList<String> result = new ArrayList<String>();
            
            ArrayList<Variable> allVariables = new ArrayList<Variable>(model.getVariableList());
	       
            int size = 10;
            for (Entity entity : model.getEntityList()) {
		        // set the size
                
                result.add("Reading entity " + entity.getName());

                if (entity.isMatrix() == false) {
                    
                    entity.setSize(size);
                    result.add("Setting its size to " + size + " for testing purposes.");
                    size++;
                }

                for (Variable variable : entity.getVariableList()) {
                    result.add("Reading variable " + variable.getName());
                }

                allVariables.addAll(entity.getVariableList());
		    }

		    Acceptation.setTopologicalList(allVariables);
		
            for (Variable variable : allVariables ) {

                if (variable.isFunctional() == true) {
                    continue;
                }
                if (variable.isData() && variable.getMissingValueCount() == 0) {
                    continue;
                }
                
                System.out.println("Testing Acceptation with parameter " + variable.getName());
                
                result.add("New value code for " + variable.getName());
                result.add("--------------");
                result.addAll(Acceptation.generateNewValueCode(variable));
                
                result.add("--------------");
                result.add("Calculating new values for functional parameters depending on " + variable.getName() + ":");
                result.add("\\begin{verbatim}");
                result.addAll(Acceptation.generateNewValuesFunctionalCode(variable));
                result.add("\\end{verbatim}");
                result.add("");

                result.add("Acceptation formula for " + variable.getName() + ":");
                result.add("\\begin{verbatim}");
                result.addAll(Acceptation.generateAcceptationFormula(variable));
                result.add("\\end{verbatim}");
                result.add("");
                
                result.add("Acceptation code for " + variable.getName() + " (if the update strategy is sequential):");
                result.add("\\begin{verbatim}");
                result.addAll(Acceptation.generateAcceptationCode(variable, "sequential"));
                result.add("\\end{verbatim}");
                result.add("");

                result.add("Acceptation code for " + variable.getName() + " (if the update strategy is random)");
                result.add("--------------");
                //System.out.println("Calling with random.");
                result.addAll(Acceptation.generateAcceptationCode(variable, "random"));
            }
            writer.write(result);
	    }
	    catch (Exception e) {
            System.out.println("Caught an exception, stopping.");
            e.printStackTrace();
	    }

        
	}
    
    public static void printArrayList(ArrayList<String> toPrint) {
        for (String element : toPrint ) {
            System.out.println(element);
        }
    }
}
