package org.prgtest.gui;

import org.gui.main.*;
import java.awt.event.*;
import org.ga.imp.GARunner;
import org.prgtest.genetic.CoverageData;
import org.prgtest.genetic.GeneVar;
import org.prgtest.settings.*;
import org.prganalysis.walker.NonRuntimeFunc;
import java.awt.Canvas;
import org.prganalysis.graph.*;

import org.gui.reporting.*;
import com.infragistics.ultrachart.data.*;
import javax.swing.table.DefaultTableModel;
import java.io.*; 
import java.util.HashMap;
public class BtnAction extends BtnInterface {
    static int xxx = 0;
    TGraph[] tgraphArray = null;
    static TGraph path = null;
    static TGraph originalGraph;
	static int progs = 0;
	static int numofpredicates = 0;
    org.prgtest.performer.Graph2Symbolic gS = null;
    org.prgtest.performer.ConditionOptimizer cO;
    static public HashMap edgeCoveredChromo = new HashMap();
    static public HashMap conditionCoveredChromoTrue = new HashMap();
    static public HashMap conditionCoveredChromoFalse = new HashMap();
    
    static GARunner garunner;
    TGraph optimizeGraph;
    String ch;
    int pathN = 0;
    public BtnAction(String imageLocation, int index, boolean initStatus) {
        super(index);
        setEnabled(initStatus);
        this.setImageIcon(imageLocation);
        this.addActionListener(new BtnActionAdapter(this));
    }

    public void performAction(ActionEvent e) {
    
    	TVertex tvertex = null;
        KernelTG kernel = KernelTG.getInstance();
        int choice=0;
        int pSel=0;
           
        switch (index) {
        case 1: {
            NonRuntimeFunc nonRuntime = new NonRuntimeFunc();
            nonRuntime.analyzeProgram(kernel);
            
            originalGraph = kernel.getProgramNonRuntimeResults().getGraph();
            Canvas canvasGraph = kernel.getProgramNonRuntimeResults().getGraph().
                                 getJPanel();
            
            kernel.setToPanel(kernel.PANEL_CENTER,
                              canvasGraph);
            //   kernel.getProgramNonRuntimeResults().exctractPaths();
            setBtnEnableStatus(2, true);
            setBtnEnableStatus(3, false);
           // setBtnEnableStatus(3, false);
            setBtnEnableStatus(1, false);
            setBtnEnableStatus(4, false);
            setBtnEnableStatus(5, false);
           // setBtnEnableStatus(5, true);
           // setBtnEnableStatus(6, true);
            break;
        }
        case 2:
        	//codikas antonis
        {
        	//final BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) );
        	
        	gS = new org.prgtest.performer.Graph2Symbolic();
        	choice = gS.run();
        	double result = 0;
        	double temp = 0;
        	if (choice ==-1)
        	{
        		for (int k=0;k<gS.getPathNumber();k++)
        		{
        		path = gS.pathConstraint(k);
        		
        		cO = new org.prgtest.performer.ConditionOptimizer(path,"path"+k);
            	progs = cO.optimizeConditions();
            	
            		if (progs==0)
            			progs=1;
            		
            		for (int x=0; x< progs; x++)
            		{
            			kernel = KernelTG.getInstance();
            			kernel.configure();
            			String fileName = "C:/LocalD/JavaWorkSpace/TestDataGenerator/src/org/testfiles/optConditions/";
            			//System.out.println("optConditions"+"path"+k+"_"+x+".java");
            			kernel.setTestFile(fileName+"optConditions"+"path"+k+"_"+x+".java");
            			optimizeGraph = kernel.getProgramNonRuntimeResults().getGraph();
            			
            			NonRuntimeFunc nonRuntime = new NonRuntimeFunc();
            			nonRuntime.analyzeProgram(kernel);
    		
            			garunner=new GARunner(kernel);
            			garunner.run();
            			
            		}
            		
        		}
        		
        		setBtnEnableStatus(2, false);
            	setBtnEnableStatus(3, false);
            	setBtnEnableStatus(4, false);
            	setBtnEnableStatus(5, true);
        	}
        	else
        	{
        	path = gS.pathConstraint(choice);
        	       
        	setBtnEnableStatus(2, false);
        	setBtnEnableStatus(3, true);
        	setBtnEnableStatus(5, false);
        	}
        	break;
        }
        	
        case 3:
        {
        	
        	final BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) );
        	
        	System.out.print("Do you want to optimize the conditions? y/n ");
      	    try
      	       {
      	    	ch = stdin.readLine();
      	       }
      	    catch(Exception exec){};
      	    
      	    if (ch.equals("y"))
      	    {
      	    	cO = new org.prgtest.performer.ConditionOptimizer(path,"path"+choice);
      	    	progs = cO.optimizeConditions();

      	    }
      	    else
      	    {
      	    	cO = new org.prgtest.performer.ConditionOptimizer(path,"path"+choice);
      	    	progs = cO.dontOptimizeConditions();
      	    	
      	    }
            
  	    	setBtnEnableStatus(3, false);
  	    	setBtnEnableStatus(5, false);
  	    	setBtnEnableStatus(4, true);
            break;
        }
        case 4: {
        
        	String fileName;
        	final BufferedReader stdin = new BufferedReader( new InputStreamReader( System.in ) );
        	int input = 0;
        	
        	fileName = "C:/LocalD/JavaWorkSpace/TestDataGenerator/src/org/testfiles/optConditions/";
        	optimizeGraph = kernel.getProgramNonRuntimeResults().getGraph();
        	
        	 if (choice != -1)
    		 {
        	    do{
        	    	System.out.println();
        	    	if (progs==0)
        	    	{
        	    		progs = 1;
        	    	}
        	    	System.out.print( "Give optimize program number: " +"((-1) - " + (progs-1) + ") ");
        	    try
        	       {
        	    	input = Integer.parseInt(stdin.readLine());
        	       }
        	    catch(Exception exec){};
        	    }while(input<-1 ||(input>=progs));
        	    
        	    if (input!=-1)
        	    {
        	    	kernel = KernelTG.getInstance();
        	    	kernel.configure();
        		
        	    	kernel.setTestFile(fileName+"optConditions"+"path"+choice+"_"+input+".java");
        	    	NonRuntimeFunc nonRuntime = new NonRuntimeFunc();
        	    	nonRuntime.analyzeProgram(kernel);

        	    	garunner=new GARunner(kernel);
        	    	garunner.run();

        	    }
        	    else
        	    {
        	    	for (int h=0; h<progs; h++ )
        	    	{
        	    		kernel = KernelTG.getInstance();
            	    	kernel.configure();
            		
            	    	kernel.setTestFile(fileName+"optConditions"+"path"+choice+"_"+h+".java");
            	    	NonRuntimeFunc nonRuntime = new NonRuntimeFunc();
            	    	nonRuntime.analyzeProgram(kernel);
            		
            	    	garunner=new GARunner(kernel);
            	    	garunner.run();

        	    	}
        	    }
    		 }
        		
        		 
        		//Thread thread=new Thread(garunner);
        		//thread.start();
        	 
        	setBtnEnableStatus(4, false);
        	setBtnEnableStatus(5, true);
            break;
        }
        case 5: {
        	System.out.println("Computing results...");
        	int a = 0;
       	 	for (int y = 0; y < originalGraph.sizeVertices();y++) {
			TVertex tVertex = (TVertex) originalGraph.vertexAt(y);
			String vertex;
			String originalVertex;
			
			try {
				 if (tVertex.getNodeElement() != null) {
					 if (tVertex.getNodeElement() instanceof barat.parser.BinaryOperationImpl) {			 
						 numofpredicates++;
						 
						 vertex = tVertex.getNodeElement().toString();
						 originalVertex = vertex;
						 if ((vertex.contains("||")) || (vertex.contains("&&")))
						 {
							 a = vertex.indexOf("||");
							 while(a!=-1){					 
							 vertex = vertex.substring(a+2);
							 a = vertex.indexOf("||");
							 numofpredicates++;
							 }
							 
							 vertex = originalVertex;
							 a = vertex.indexOf("&&");
							 
							 while(a!=-1){
								 vertex = vertex.substring(a+2);
								 a = vertex.indexOf("&&");
								 numofpredicates++;
							  }
						 }
						 
					 }
				 }
			 }catch(Exception ere)
			 {
				 
			 }
       	 	}
			
        	org.prgtest.common.VarRepositar VR = new org.prgtest.common.VarRepositar();
    		org.prgtest.common.AVar avar;
    		Object[] objArray_edges;
    		Object[] objArray_trueConds;
    		Object[] objArray_falseConds;
    		
    		System.out.println("Created " + garunner.FittestChromos.size() + " test cases");
    
    		if (garunner.FittestChromos.size()>0)
    		{
    		for (int h=0; h<garunner.FittestChromos.size();h++)
    		{
    			VR.clear(); 			
    			for (int i=0; i<garunner.FittestChromos.get(h).size();i++)
    			{
    				GeneVar gene = (GeneVar)garunner.FittestChromos.get(h).getGene(i);
    				avar = (org.prgtest.common.AVar)gene.getAllele();
    				VR.add(avar);
    				System.out.println(avar.getVariableName() + ": " + avar.getCurrentValue());
    			}
    			
    			System.out.println();
    			CoverageData CD = new CoverageData(VR);
    			CD.execute(originalGraph);
    			
    			objArray_edges = CD.getEdgeCovered().keySet().toArray();
    			
    			 for (int z = 0; z < objArray_edges.length; z++) {
    				 if (!edgeCoveredChromo.containsKey(objArray_edges[z]))
    				 {
    					 edgeCoveredChromo.put(objArray_edges[z], null);
    				 }
    			 }
    			 
    			 objArray_trueConds = CD.getConditionTrueCovered().keySet().toArray();
     			
    			 for (int z = 0; z < objArray_trueConds.length; z++) {
    				 if (!conditionCoveredChromoTrue.containsKey(objArray_trueConds[z]))
    				 {
    					 conditionCoveredChromoTrue.put(objArray_trueConds[z], null);
    				 }
    			 }
    			 
    			 objArray_falseConds = CD.getConditionFalseeCovered().keySet().toArray();
     			
    			 for (int z = 0; z < objArray_falseConds.length; z++) {
    				 if (!conditionCoveredChromoFalse.containsKey(objArray_falseConds[z]))
    				 {
    					 conditionCoveredChromoFalse.put(objArray_falseConds[z], null);
    				 }
    			 }
    		
    		}
    		
    		
    		/*
    		//arithmos test cases
    		for (int h=0; h<3;h++)
    		{
    			VR.clear();
    			//arithmos metavlitwn
    			
    			if (h==1)
    			{
    				avar = new org.prgtest.common.AVar("num1",0); 
    				VR.add(avar);
    				avar = new org.prgtest.common.AVar("num2",0); 
    				VR.add(avar);
    				avar = new org.prgtest.common.AVar("num3",0); 
    				VR.add(avar);
    			}
    			else {
    				if (h==2){
    					avar = new org.prgtest.common.AVar("num1",0); 
        				VR.add(avar);
        				avar = new org.prgtest.common.AVar("num2",0); 
        				VR.add(avar);
        				avar = new org.prgtest.common.AVar("num3",1); 
        				VR.add(avar);
    				}
    				else
    				{
    					if (h==3)
    					{
    						avar = new org.prgtest.common.AVar("num1",1); 
    	    				VR.add(avar);
    	    				avar = new org.prgtest.common.AVar("num2",0); 
    	    				VR.add(avar);
    	    				avar = new org.prgtest.common.AVar("num3",1); 
    	    				VR.add(avar);
    					}
    					else
    					{
    						if (h==4)
    						{
    						avar = new org.prgtest.common.AVar("i",1); 
    	    				VR.add(avar);
    	    				avar = new org.prgtest.common.AVar("j",1); 
    	    				VR.add(avar);
    	    				avar = new org.prgtest.common.AVar("k",1); 
    	    				VR.add(avar);
    						}
    						else
    						{
    							if (h==5)
    							{
    							avar = new org.prgtest.common.AVar("i",1); 
        	    				VR.add(avar);
        	    				avar = new org.prgtest.common.AVar("j",0); 
        	    				VR.add(avar);
        	    				avar = new org.prgtest.common.AVar("k",0); 
        	    				VR.add(avar);
    							}
    							else
    							{
    								avar = new org.prgtest.common.AVar("i",1); 
            	    				VR.add(avar);
            	    				avar = new org.prgtest.common.AVar("j",0); 
            	    				VR.add(avar);
            	    				avar = new org.prgtest.common.AVar("k",0); 
            	    				VR.add(avar);
    							}
    						}
    					}
    				}
    			}
    				*/
    				//System.out.println(avar.getVariableName() + ": " + avar.getCurrentValue());
    			
    			
    			System.out.println();
    			CoverageData CD = new CoverageData(VR);
    			CD.execute(originalGraph);
    			
    			objArray_edges = CD.getEdgeCovered().keySet().toArray();
    			
    			 for (int z = 0; z < objArray_edges.length; z++) {
    				 if (!edgeCoveredChromo.containsKey(objArray_edges[z]))
    				 {
    					 edgeCoveredChromo.put(objArray_edges[z], null);
    				 }
    			 }
    			 
    			 objArray_trueConds = CD.getConditionTrueCovered().keySet().toArray();
     			
    			 for (int z = 0; z < objArray_trueConds.length; z++) {
    				 if (!conditionCoveredChromoTrue.containsKey(objArray_trueConds[z]))
    				 {
    					 conditionCoveredChromoTrue.put(objArray_trueConds[z], null);
    				 }
    			 }
    			 
    			 objArray_falseConds = CD.getConditionFalseeCovered().keySet().toArray();
     			
    			 for (int z = 0; z < objArray_falseConds.length; z++) {
    				 if (!conditionCoveredChromoFalse.containsKey(objArray_falseConds[z]))
    				 {
    					 conditionCoveredChromoFalse.put(objArray_falseConds[z], null);
    				 }
    			 }
    		
    		double EdgePercentage = (double)this.edgeCoveredChromo.size()/(double)originalGraph.sizeEdges(); 
			System.out.println("Edge Coverage " + EdgePercentage * 100 + " %");
			
			double ConditionPercentage = (((double)(this.conditionCoveredChromoFalse.size() + conditionCoveredChromoTrue.size())/(double)(2* numofpredicates)));
			System.out.println("Condition Coverage " + ConditionPercentage * 100 + " %");
        	
			double Edge_Cond_Percentage = ((double)EdgePercentage + (double)ConditionPercentage)/2;
			System.out.println("Edge - Condition Coverage " + Edge_Cond_Percentage * 100 + " %");
			
			System.out.println();
			System.out.println("Fitness Function Results");
			for (int t =0; t<garunner.fitnessInfo.size();t++)
			{
				System.out.println(garunner.fitnessInfo.get(t));
			}
    		}
			setBtnEnableStatus(5, false);
            break;
        }
        case 6: {
            //kernel.runGradientDescent();
            break;

        }

        }

    }
}
