package fr.univ_lehavre.iwocs.m2.vortex.tourbillon;

import java.io.*;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class ReadFileTxt2Csv {
	 private double[] input;
	 private double output;
	 private String fichierLine=new String();
	 private String fichierCoord=new String();
	 private String fichierWork=new String();
	public  ReadFileTxt2Csv(String fichierLine,String fichierCoord, String fichierWork) throws IOException {
		this.fichierLine=fichierLine;
		this.fichierCoord=fichierCoord;
		this.fichierWork=fichierWork;
	
	}
	public void setFichierLine(String fichierLine) {
		this.fichierLine=fichierLine;
		
	}
	
	public void setFichierCoord(String fichierCoord) {
		this.fichierCoord=fichierCoord;
		
	}
	
	public void setFichierWork(String fichierWork) {
		this.fichierWork=fichierWork;
		
	}
	public void setInput(double[] input) {
		for(int i=0;i<input.length;i++) {
			this.input[i]=input[i];
		}
	}public void setOutput(double output) {
			this.output=output;
		
	}
	public String getFichierLine(){
		return this.fichierLine;
	}
	
	public String getFichierCoord(){
		return this.fichierCoord;
	}
	
	public String getFichierWork(){
		return this.fichierWork;
	}
	public double[] getInput() {
		return input;
	}
	public double getOutput() {
		return output;
	}
	
public void txt2csv(String fichierTxt,String fichierCsv) throws IOException {
	String fichierEntree = fichierTxt;
	FileReader entree = new FileReader(fichierEntree);
	FileWriter sortie = new FileWriter(fichierCsv);
	int c;
	System.out.println("transformation de " + fichierEntree + " en fichier CSV");
	while((c = entree.read()) != -1) {
				if((c==32)){
				sortie.write(59);	
				}
				sortie.write(c);
	}
	entree.close();
	sortie.close();
    }


	
	public void csvFindCoord(String file, String coord, String res) throws IOException {
		Scanner s = null;
		int cpt =0;
		int n=0;
		this.setFichierWork(res);
		String content="";
		//FileWriter sortie = new FileWriter(res+".csv");
	        try {
            s = new Scanner(new BufferedReader(new FileReader(new File(file))));

            while (s.hasNext()) {
            
            	 if(cpt==5) {
              	   
              	   cpt=0;
              	   content = content + "\n";
                 }
            		cpt++;
                n =Integer.parseInt(s.next());
                
           	     
           	     
           	       BufferedReader br = new BufferedReader(new FileReader(new File(coord)));
           	       for (int i=0;i<(n-1);i++) {
           	        br.readLine();
           	       
           	       }
           	         content = content+ (String)br.readLine();
           	         /*content.substring(content.indexOf(" "),content.lastIndexOf(" "));
           	         content.substring(0,content.lastIndexOf(" "));
           	        */content.replace(" ", ";");
           	    
           	        BufferedWriter bw = null;
        		FileWriter fw = null;

        		

        			//String content = "This is the content to write into file\n";
        		try {
        			
        			bw = new BufferedWriter(new FileWriter (new File (res)));
        			bw.write(content);
        			
        			//System.out.println("Done"+content);
        			
        		}catch(IOException ef) {
        			ef.printStackTrace();
        		}finally {

        			try {
        				
        				if (bw != null)
        					bw.close();

        				if (fw != null)
        					fw.close();
        				
        		}catch(IOException ex) {
        			ex.printStackTrace();
        		}
        		}
        			
        			
        		
        		
            
        		
	
        		
	
        }
        
        
	}catch(IOException e) {
		e.printStackTrace();
	}
        s.close();
	}
	

	/*public  void Txt2Csv(String nomFichier) throws IOException {
		String fichierLecture = nomFichier;
		FileReader entree = new FileReader(fichierLecture);
		FileWriter sortie = new FileWriter(fichierLecture+".csv");
		int c;
		System.out.println("transformation de " + fichierLecture + "en fichier CSV");
		for(int i =0; i<5;i++)
			
		sortie.write("x"+i+";y"+i+";z"+i+";diam"+i+";noise"+i+"; ;");
		sortie.write("\n");
		while((c = entree.read()) != -1) {
					if((c==32)){
					sortie.write(59);	
					}
					sortie.write(c);
		}
		entree.close();
		sortie.close();
	    }*/
	public int countLines(String filename) throws IOException {
	    InputStream is = new BufferedInputStream(new FileInputStream(filename));
	    try {
	        byte[] c = new byte[1024];
	        int count = 0;
	        int readChars = 0;
	        boolean empty = true;
	        while ((readChars = is.read(c)) != -1) {
	            empty = false;
	            for (int i = 0; i < readChars; ++i) {
	                if (c[i] == '\n') {
	                    ++count;
	                }
	            }
	        }
	        return (count == 0 && !empty) ? 1 : count;
	    } finally {
	        is.close();
	    }
	}
	
	public void doubleFindCoord(String nomFichier) throws IOException {
		String fichier = nomFichier;
		FileReader entree = new FileReader(fichier);
	int nbLines=	this.countLines(fichier);
	List<double[][]> vector=new ArrayList<double[][]>();
		//double[] sortie=new double[5];
		String c;
		//for(int i =0; i<5;i++)
			double[][] exploitation=new double[nbLines][5];
		//sortie.write("x"+i+";y"+i+";z"+i+";diam"+i+";noise"+i+"; ;");
		//sortie.write("\n");
		//int i=0;
		char r;
		Scanner sc = null;
		BufferedReader buf = new BufferedReader(new FileReader(new File(fichier)));
	
		try {
            sc = new Scanner(buf);
            int i=0;
            while (sc.hasNext()) {
            	if(i!=(nbLines-1)) {
           
            for (int j=0;j<5;j++) {
            		
	            		
            			exploitation[i][j] =Double.parseDouble(sc.next());
            			
            			System.out.print(exploitation[i][j]+";");
            		} 
            vector.add(exploitation);
            	}
            	
            
          //  	("-->"+i+"i"+nbLines+"-->nb;");
            
            }
            }finally {
			sc.close();
		}
		
		//return  (ArrayList) vector;
}

	public ArrayList Txt2DoubleArray(String nomFichier) throws IOException {
			String fichier = nomFichier;
			FileReader entree = new FileReader(fichier);
		int nbLines=	this.countLines(fichier);
		List<double[][]> vector=new ArrayList<double[][]>();
			//double[] sortie=new double[5];
			String c;
			//for(int i =0; i<5;i++)
				double[][] exploitation=new double[nbLines][5];
			//sortie.write("x"+i+";y"+i+";z"+i+";diam"+i+";noise"+i+"; ;");
			//sortie.write("\n");
			//int i=0;
			char r;
			Scanner sc = null;
			BufferedReader buf = new BufferedReader(new FileReader(new File(fichier)));
		
			try {
	            sc = new Scanner(buf);
	            int i=0;
	            while (sc.hasNext()) {
	            	if(i!=(nbLines-1)) {
	           
	            for (int j=0;j<5;j++) {
	            		
		            		
	            			exploitation[i][j] =Double.parseDouble(sc.next());
	            			
	            			System.out.print(exploitation[i][j]+";");
	            		} 
	            vector.add(exploitation);
	            	}
	            	
	            
	          //  	("-->"+i+"i"+nbLines+"-->nb;");
	            
	            }
	            }finally {
    			sc.close();
    		}
			
			return  (ArrayList) vector;
	}
	
	
	
	/*public void cat(String file)  {

		
	    String thisLine;
	 
	   //Loop across the arguments
	   for (int i=0; i < args.length; i++) {
	 
	     //Open the file for reading
	     try {
	       BufferedReader br = new BufferedReader(new FileReader(args[i]));
	       while ((thisLine = br.readLine()) != null) { // while loop begins here
	         System.out.println(thisLine);
	       } // end while 
	     } // end try
	     catch (IOException e) {
	       System.err.println("Error: " + e);
	     }
	  } // end for
	  
	} // end main
*/
	

/*	public ReadFileTxt2Csv(String fichierCoord, String fichierLine, String resultFile ) throws IOException {
		
		int n=0;
		int cl;
		int cc;
		String tempFile;
		FileReader coord=new FileReader(fichierCoord);
		FileReader line=new FileReader(fichierLine);
		FileWriter result = new FileWriter(resultFile);
		FileWriter temp= new FileWriter(tempFile);
		while((cl=line.read())!=-1) {
			while((cl=line.read())!=32) {
				n=(int)cl;
				int i=0;
				while(i!=n) {
					coord.readLine();
				}
			}
				
			
		}
	   
	   
	    formater.close();
	  
	    }
	*/
	public static void main(String[] args) throws IOException {
		ReadFileTxt2Csv FileProceed = new ReadFileTxt2Csv(args[0],args[1],args[2]);
		//file.Test(args[0],args[1],args[2]);
		//file.Txt2DoubleArray(args[2]);
		FileProceed.txt2csv(FileProceed.getFichierCoord(),"coord.csv");
		FileProceed.csvFindCoord(FileProceed.getFichierLine(),"coord.csv", FileProceed.getFichierWork());
		//System.out.println(FileProceed.getFichierWork());
		//FileProceed.txt2csv(FileProceed.getFichierWork(),FileProceed.getFichierWork());
	}
}
	//Packages à importer afin d'utiliser les objets

	/*public void Main() {
	 
	    // Nous déclarons nos objets en dehors du bloc try/catch
	    FileInputStream fis = null;
	    FileOutputStream fos = null;

	    try {
	       // On instancie nos objets :
	       // fis va lire le fichier
	       // fos va écrire dans le nouveau !
	       fis = new FileInputStream(new File("test.txt"));
	       fos = new FileOutputStream(new File("test2.txt"));

	       // On crée un tableau de byte pour indiquer le nombre de bytes lus à
	       // chaque tour de boucle
	       byte[] buf = new byte[8];

	       // On crée une variable de type int pour y affecter le résultat de
	       // la lecture
	       // Vaut -1 quand c'est fini
	       int n = 0;

	       // Tant que l'affectation dans la variable est possible, on boucle
	       // Lorsque la lecture du fichier est terminée l'affectation n'est
	       // plus possible !
	       // On sort donc de la boucle
	       while ((n = fis.read(buf)) >= 0) {
	          // On écrit dans notre deuxième fichier avec l'objet adéquat
	    		   fos.write(buf);
	    	     System.out.println("");
	          //Nous réinitialisons le buffer à vide
	          //au cas où les derniers byte lus ne soient pas un multiple de 8
	          //Ceci permet d'avoir un buffer vierge à chaque lecture et ne pas avoir de doublon en fin de fichier
	          buf = new byte[8];
	          
	       }
	       System.out.println("Copie terminée !");

	    } catch (FileNotFoundException e) {
	       // Cette exception est levée si l'objet FileInputStream ne trouve
	       // aucun fichier
	       e.printStackTrace();
	    } catch (IOException e) {
	       // Celle-ci se produit lors d'une erreur d'écriture ou de lecture
	       e.printStackTrace();
	    } finally {
	       // On ferme nos flux de données dans un bloc finally pour s'assurer
	       // que ces instructions seront exécutées dans tous les cas même si
	       // une exception est levée !
	       try {
	          if (fis != null)
	             fis.close();
	       } catch (IOException e) {
	          e.printStackTrace();
	       }

	       try {
	          if (fos != null)
	             fos.close();
	       } catch (IOException e) {
	          e.printStackTrace();
	       }
	    }
	 }
	
	//class LireEcrireTexte {

	
public static void main(String[] arg) throws IOException {
ReadFileTxt2Csv tr = new ReadFileTxt2Csv (arg[0]);

}
}
	/*  public static void main(String[] args) {
    File fichier = new File(args[0]);
    int car;
    StringBuffer contenu = new StringBuffer("");
    FileInputStream ftemp = null;
    try {
      ftemp = new FileInputStream(fichier);
      while( (car = ftemp.read()) != -1)
        contenu.append((char)car);
      ftemp.close();
    }
    catch(FileNotFoundException e) {
      System.out.println("Fichier introuvable");
    }
    catch(IOException ioe) {
      System.out.println("Exception " + ioe);
    }
    System.out.println(contenu);
  }

//Packages à importer afin d'utiliser les objets

public void Main() {
 
    // Nous déclarons nos objets en dehors du bloc try/catch
    FileInputStream fis = null;
    FileOutputStream fos = null;

    try {
       // On instancie nos objets :
       // fis va lire le fichier
       // fos va écrire dans le nouveau !
       fis = new FileInputStream(new File("test.txt"));
       fos = new FileOutputStream(new File("test2.txt"));

       // On crée un tableau de byte pour indiquer le nombre de bytes lus à
       // chaque tour de boucle
       byte[] buf = new byte[8];

       // On crée une variable de type int pour y affecter le résultat de
       // la lecture
       // Vaut -1 quand c'est fini
       int n = 0;

       // Tant que l'affectation dans la variable est possible, on boucle
       // Lorsque la lecture du fichier est terminée l'affectation n'est
       // plus possible !
       // On sort donc de la boucle
       while ((n = fis.read(buf)) >= 0) {
          // On écrit dans notre deuxième fichier avec l'objet adéquat
    		   fos.write(buf);
    	     System.out.println("");
          //Nous réinitialisons le buffer à vide
          //au cas où les derniers byte lus ne soient pas un multiple de 8
          //Ceci permet d'avoir un buffer vierge à chaque lecture et ne pas avoir de doublon en fin de fichier
          buf = new byte[8];
          
       }
       System.out.println("Copie terminée !");

    } catch (FileNotFoundException e) {
       // Cette exception est levée si l'objet FileInputStream ne trouve
       // aucun fichier
       e.printStackTrace();
    } catch (IOException e) {
       // Celle-ci se produit lors d'une erreur d'écriture ou de lecture
       e.printStackTrace();
    } finally {
       // On ferme nos flux de données dans un bloc finally pour s'assurer
       // que ces instructions seront exécutées dans tous les cas même si
       // une exception est levée !
       try {
          if (fis != null)
             fis.close();
       } catch (IOException e) {
          e.printStackTrace();
       }

       try {
          if (fos != null)
             fos.close();
       } catch (IOException e) {
          e.printStackTrace();
       }
    }
 }
}
*/
//class LireEcrireTexte {
   