package plab.prefuseTests;

import java.io.BufferedReader;

import java.io.FileReader;

import java.io.IOException;

import java.util.StringTokenizer; 

import javax.swing.JOptionPane;

import prefuse.data.Graph;
import prefuse.data.Table;
import prefuse.data.column.ColumnFactory;
import prefuse.data.column.DoubleColumn;
public class MatrixIn {

      
	// Takes and text file and changes it into a String Object

      public static int getJMax(String aFile) throws IOException {

          BufferedReader reader = new BufferedReader(new FileReader(aFile));
          String line = null;
          int j=0;
          while ((line = reader.readLine()) != null) {
        	  	j++;
          } 
          return j;

    } 
      public static int getIMax(String aFile) throws IOException {

          BufferedReader reader = new BufferedReader(new FileReader(aFile));
          String line = reader.readLine();
          int i=0;
          StringTokenizer tokens = new StringTokenizer(line);
          while (tokens.hasMoreTokens()) {
        	  tokens.nextToken();
               i++;

          }
          return i;
    } 
      
      public static double[][] fileToMatrix(String aFile) throws IOException {

    	  int i=getIMax(aFile);
    	  int j=getJMax(aFile);
    	  double[][] m=new double[i][j];
    	  int a=0;
    	  int b=0;
            BufferedReader reader = new BufferedReader(new FileReader(aFile));
            String line = reader.readLine();
            StringTokenizer tokens = new StringTokenizer(line);
            while (b<j && a<i) {
            	if(a+1==i && (line = reader.readLine()) != null)
            	{
            		a=0;
            		b++;
            		tokens = new StringTokenizer(line);
            	}
            	
            	String temp=tokens.nextToken();
            	String num=temp.substring(0, temp.indexOf("e"));
            	String exp=temp.substring(temp.indexOf("e")+1,temp.length());
            	m[a][b]=Double.parseDouble(num)*Math.pow(10, Double.parseDouble(exp));
            	a++;
            } 
            return m;
      } 
      public static Graph getGraphfromFile() throws IOException
      {
    	  boolean done=false;
    	  String file="unknown";
    	  while(!done)
    	  {
	    	  file = JOptionPane.showInputDialog(null, "Enter a file path and name of the data file.");
	    	  try
	    	  {
	    		  BufferedReader reader = new BufferedReader(new FileReader(file));
	    		  done=true;
	    	  }
	    	  catch(IOException e)
	    	  {
	    		  JOptionPane.showMessageDialog(null,"I weep for humanity, Please really choose a file this time");
	    	  }
    	  }
    	  double[][] m=fileToMatrix(file);
    	  
    	  //creating node column
    	  Table nodes= new Table(m.length,1);
    	  nodes.addColumn("label", int.class);
    	  for (int i=0; i<m.length; i++)
    	  {
    		  nodes.set(i, 0,i);
    	  }
    	  int sizer=0;
    	  for (int i=0; i<m.length; i++)
    	  {
    		  for (int j=0; j<m.length; j++)
        	  {
    			  if(m[i][j]>0)
    			  {
    			  
    				  sizer++;
    			  }
        	  }
    	  }
    	  //creating edages colemns
    	  Table edageT= new Table(sizer,2);
    	  edageT.addColumn("source", int.class);
    	  edageT.addColumn("target", int.class);
    	  int row=0;
    	  for (int i=0; i<m.length; i++)
    	  {
    		  for (int j=0; j<m.length; j++)
        	  {
    			  if(m[i][j]>0)
    			  {
    				  edageT.set(row, 0, i);
    				  edageT.set(row, 1, j);
    				  row++;
    			  }
        	  }
    	  }
    	  return new Graph(nodes,edageT,false,"label","source","target");
      }
  
}
