package plab.prefuseTests;

import java.awt.Component;
import java.io.File;
import javax.swing.JFrame;
import javax.swing.JFileChooser;
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;

public class MatrixIn_1_1 {

    // Takes and text file and changes it into a String Object
    public static int getJMax(File 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(File aFile) throws IOException {

        BufferedReader reader = new BufferedReader(new FileReader(aFile));
        String line = reader.readLine();
        if ((line = reader.readLine()) != null) {
            line = reader.readLine();
        }
        int i = 0;
        StringTokenizer tokens = new StringTokenizer(line);
        while (tokens.hasMoreTokens()) {
            tokens.nextToken();
            i++;

        }
        return i;
    }

    public static int[][] fileToMatrix(File aFile) throws IOException {
        try
        {
        int numRows = 0;
        int i = getIMax(aFile);
        int j = getJMax(aFile);
        int[][] m = new int[0][0];
        if (i != 3) {
            int k = 0;
            int l = 0;
            BufferedReader reader = new BufferedReader(new FileReader(aFile));
            String line = reader.readLine();
            StringTokenizer tokens = new StringTokenizer(line);
            while (l < j && k < i) {
                if (k + 1 == i && (line = reader.readLine()) != null) {
                    k = 0;
                    l++;
                    tokens = new StringTokenizer(line);
                }
                k++;
                String temp = tokens.nextToken();
                String num = temp.substring(0, temp.indexOf("e"));
                if (Double.parseDouble(num) != 0) {
                    numRows++;
                }
            }

            m = new int[3][numRows];
            int a = 0;
            int b = 0;
            reader = new BufferedReader(new FileReader(aFile));
            line = reader.readLine();
            tokens = new StringTokenizer(line);
            int c = 0;
            while (b < j && a < i) {
                if (a + 1 == i && (line = reader.readLine()) != null) {

                    a = 0;
                    b++;
                    tokens = new StringTokenizer(line);
                }
                if(i!=1)
                {
                String temp = tokens.nextToken();
                String num = temp.substring(0, temp.indexOf("e"));
                String exp = temp.substring(temp.indexOf("e") + 1, temp.length());
                if (Double.parseDouble(num) != 0) {
                    m[0][c] = a;
                    m[1][c] = b;
                    m[2][c] = (int) (Double.parseDouble(num) * Math.pow(10, Double.parseDouble(exp)) * numRows);
                    c++;
                }
                }
            else
            {
                String num = tokens.nextToken();
                m[0][c] = (int) (Double.parseDouble(num)*numRows);
                    c++;;
                a++;
            }
        }
        }
            else {
            int b = 0;

            BufferedReader reader = new BufferedReader(new FileReader(aFile));
            String line = reader.readLine();
            line = reader.readLine();
            line = reader.readLine();

            StringTokenizer tokens = new StringTokenizer(line);
            tokens.nextToken();
            tokens.nextToken();
            double r = Double.parseDouble(tokens.nextToken());
            m = new int[3][j];
            line = reader.readLine();
            while ((line = reader.readLine()) != null) {
                tokens = new StringTokenizer(line);

                int iloc = Integer.parseInt(tokens.nextToken());
                System.out.println(iloc);
                int jloc = Integer.parseInt(tokens.nextToken());
                int prob = Integer.parseInt(tokens.nextToken());
                m[0][b] = iloc;
                m[1][b] = jloc;
                m[2][b] = prob;
                b++;
            }

        }
        return m;
        }catch(StackOverflowError soe)
    {
        JOptionPane.showMessageDialog(null, "quite sorry buy the fiule youve selected is simply too large to show be displayed in any meaningful way :(");
    }
        return null;
    }

    public static Table getEqCol(Component c) throws IOException {
        boolean done = false;
        File equiv = null;
        int[][] e = null;
        while (!done) {
            JFileChooser jfc = new JFileChooser();

            jfc.setDialogType(JFileChooser.OPEN_DIALOG);
            jfc.setDialogTitle("Navigate to a .mtx or .dat file");

            int returnVal = jfc.showOpenDialog(c);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("You chose to open this file: " + jfc.getSelectedFile().getName());

                equiv = jfc.getSelectedFile();
            }
            try {
                BufferedReader reader = new BufferedReader(new FileReader(equiv));
                done = true;

            } catch (IOException e1) {
                JOptionPane.showMessageDialog(null, "I weep for humanity, Please really choose a file this time");
            }
        }
        if (fileToMatrix(equiv)[0].length == 1) {
            e = fileToMatrix(equiv);
        }

        Table nodes = new Table((int) e[0][e.length], 0);
        nodes.addColumn("eqProb", int.class);
        for (int i = 0; i < e.length; i++) {
            nodes.set(i, 0, e[0][i]);
        }

        return nodes;

    }

    public static Graph getGraphfromFile(Component c) throws IOException {
        boolean done = false;
        File file = null;
        File equiv = null;
        
        while (!done) {
            JFileChooser jfc = new JFileChooser();

            jfc.setDialogType(JFileChooser.OPEN_DIALOG);
            jfc.setDialogTitle("Navigate to a .mtx or .dat file");

            int returnVal = jfc.showOpenDialog(c);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("You chose to open this file: " + jfc.getSelectedFile().getName());
                done = true;
                file = jfc.getSelectedFile();
            }

        }
        int[][] m = null;
        int[][] e = null;
        m = fileToMatrix(file);

        int eq = JOptionPane.showConfirmDialog(null, "do you have equlibrum probibility information to go with this transition data? \n (You may add this information later)");
        if ( eq == JOptionPane.CANCEL_OPTION || eq == JOptionPane.CLOSED_OPTION );
        System.out.println(eq);
        while (eq == 0) {
            JFileChooser jfc = new JFileChooser();

            jfc.setDialogType(JFileChooser.OPEN_DIALOG);
            jfc.setDialogTitle("Navigate to a .mtx or .dat file");

            int returnVal = jfc.showOpenDialog(c);
            if (returnVal == JFileChooser.APPROVE_OPTION) {
                System.out.println("You chose to open this file: " + jfc.getSelectedFile().getName());

                equiv = jfc.getSelectedFile();
            }
            try {
                BufferedReader reader = new BufferedReader(new FileReader(equiv));
                eq = 10;
            } catch (IOException e1) {
                JOptionPane.showMessageDialog(null, "I weep for humanity, Please really choose a file this time");
            }
        }
        if (eq == 10 && fileToMatrix(equiv)[0].length == 1) {
            e = fileToMatrix(equiv);
        }

        //creating node column
        System.out.println(m[0].length);
        Table nodes = new Table(m[0].length, 1);
        nodes.addColumn("label", int.class);
        nodes.addColumn("eqProb", int.class);
        for (int i = 0; i < m[0].length; i++) {
            nodes.set(i, 0, i);
        }
        if (eq == 10 && fileToMatrix(equiv)[0].length == 1) {
            for (int i = 0; i < e.length; i++) {
                nodes.set(i, 1, e[0][i]);
            }
        }
        //creating edages colemns
        Table edageT = new Table(m[0].length, 2);
        edageT.addColumn("source", int.class);
        edageT.addColumn("target", int.class);
        edageT.addColumn("probability", int.class);
        int row = 0;
        for (int i = 0; i < m[0].length; i++) {

            edageT.set(i, 0, i);
            edageT.set(i, 1, m[1][i]);
            edageT.set(i, 2,(double) m[2][i]/m[0].length);
        }
        return new Graph(nodes, edageT, true, "label", "source", "target");
    }
}
