
package projet_freyja.ihm;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
import java.io.*;
import java.util.logging.Level;
import java.util.logging.Logger;
import projet_freyja.math.ApplicationLineaire;
import projet_freyja.math.EspaceVectoriel;
import projet_freyja.math.Vecteur;

public class WindowDefAL extends JFrame{
    
    //Attributs
    protected JLabel labelLibelle;
    protected JTextField libelle;
    protected JLabel labelEspaceDep;
    protected JComboBox espaceDep;
    protected JLabel labelEspaceArr;
    protected JComboBox espaceArr;
    protected JLabel labelDefinition;
    protected JTextField definition;
    protected JButton boutonEnregistrer;
    
    public WindowDefAL(){
        //Création de la fenêtre
        this.setTitle("New application linéaire");
        this.setSize(800, 600);
        
        //Création des composants
        labelLibelle = new JLabel("Libellé : ");
        libelle = new JTextField("Entrez un libellé");
        labelEspaceDep = new JLabel("Espace de départ : ");
        espaceDep = new JComboBox();
        labelEspaceArr = new JLabel("Espace d'arrivé : ");
        espaceArr = new JComboBox();
        labelDefinition = new JLabel("Matrice associée : ");
        definition = new JTextField("Entrez la matrice associée");
        boutonEnregistrer = new JButton("Enregistrer");
        
        //Contenu combobox
        File rep = new File("src\\projet_freyja\\donnees\\espacesVectoriels");
        File[] fichiers = rep.listFiles();
        String nomEV = "";
        for(int i = 0; i < fichiers.length; i++){
            nomEV = (fichiers[i].getName() != null) ? fichiers[i].getName().substring(0,fichiers[i].getName().indexOf('.')) : "";
            espaceDep.addItem(nomEV);
            espaceArr.addItem(nomEV);
        }
        
        //Mise sur écoute des boutons
        boutonEnregistrer.addActionListener(new ButtonEnregistrerListener());
        
        //Mise en place des composants
            //1ere ligne
            JPanel l1 = new JPanel();
            l1.setLayout(new BoxLayout(l1, BoxLayout.LINE_AXIS));
            l1.add(labelLibelle);
            l1.add(libelle);
            
            //2eme ligne
            JPanel l2 = new JPanel();
            l2.setLayout(new BoxLayout(l2, BoxLayout.LINE_AXIS));
            l2.add(labelEspaceDep);
            l2.add(espaceDep);
            
            //3eme ligne
            JPanel l3 = new JPanel();
            l3.setLayout(new BoxLayout(l3, BoxLayout.LINE_AXIS));
            l3.add(labelEspaceArr);
            l3.add(espaceArr);
            
            //4eme ligne
            JPanel l4 = new JPanel();
            l4.setLayout(new BoxLayout(l4, BoxLayout.LINE_AXIS));
            l4.add(labelDefinition);
            l4.add(definition);
            
            //5eme ligne
            JPanel l5 = new JPanel();
            l5.setLayout(new BoxLayout(l5, BoxLayout.LINE_AXIS));
            l5.add(boutonEnregistrer);
            
            //Mise en colone
            JPanel col = new JPanel();
            col.setLayout(new BoxLayout(col, BoxLayout.PAGE_AXIS));
            col.add(l1);
            col.add(l2);
            col.add(l3);
            col.add(l4);
            col.add(l5);
            
        //Ajout du conteneur
        this.getContentPane().add(col);
        
        //Dimensionnement de la fenêtre
        this.pack();
        
        //Affichage de la fenêtre
        this.setVisible(true);
    }
    
    //Ecoute des boutons
    class ButtonEnregistrerListener implements ActionListener{
        @Override
        public void actionPerformed(ActionEvent arg0){
            String lib = libelle.getText();
            String def = definition.getText();
            int nbVecteur = 0;
            for(int i = 0; i < def.length(); i++){
                if(def.charAt(i) == 59){
                    nbVecteur++;
                }
            }
            Vecteur[] mat = new Vecteur[nbVecteur+1];
            
            //Lecture de l'espace vectoriel de départ
            ObjectInputStream ois = null;
            try {
                //On tente d'ouvrir le fichier
                ois = new ObjectInputStream(new FileInputStream("src\\projet_freyja\\donnees\\espacesVectoriels\\"+espaceDep.getSelectedItem()+".obj"));
            } catch (IOException ex) {
                Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                //On essai de désérialiser l'espace vectoriel
                EspaceVectoriel ed = (EspaceVectoriel)ois.readObject();
                //Lecture de l'espace vectoriel d'arrivée
                try {
                    //On tente d'ouvrir le fichier
                    ois = new ObjectInputStream(new FileInputStream("src\\projet_freyja\\donnees\\espacesVectoriels\\"+espaceArr.getSelectedItem()+".obj"));
                } catch (IOException ex) {
                    Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    //On essai de désérialiser l'espace vectoriel
                    EspaceVectoriel ea = (EspaceVectoriel)ois.readObject();
                    
                    //Construction de la famille de vecteurs à partir de la chaine
                    int i = 0;
                    int k = 0;
                    int h = 0;
                    String nbr;
                    int c;
                    int nbVirgule = 0;
                    int z = 0;
                    int e = 0;
                    while(def.charAt(z) != 59){
                        e++;
                        z++;
                    }
                    for(int a = 0; a < def.substring(0, e).length(); a++){
                        if(def.charAt(a) == 44){
                            nbVirgule++;
                        }
                    }
                    String[] vec = new String[nbVirgule+1];
                    System.out.println(vec.length);
                    while(i < def.length()){ //On parcours la chaine saisie
                        if(def.charAt(i) == 40){ //Si le caractère courant est "("
                            k = 0;
                            nbr = "";
                            c = i;
                            while(def.charAt(c) != 44){ //Tant qu'on lit pas ","
                               if(def.charAt(c) != 40 && def.charAt(c) != 41){ //On s'assure que c'est pas un mauvais caractère
                                    nbr += def.charAt(c); //On mémorise les chiffres
                               }
                               c++;
                            }
                            vec[k] = nbr; //On ajoute les chiffres dans la première case du tableau
                            k++;
                        }
                        else if(def.charAt(i) == 44){ //Si le caractère courant est ","
                            nbr = "";
                            c = i+1;
                            while(def.charAt(c) != 44 && def.charAt(c) != 41){//Tant qu'on lit pas "," ou ")"
                                if(def.charAt(c) != 40){ //On s'assure que c'est pas un mauvais caractère
                                    nbr += def.charAt(c); //On mémorise les chiffres
                                }
                                c++;
                            }
                            vec[k] = nbr; //On ajoute les chiffres dans le tableau
                            k++;
                            if(def.charAt(c) == 41){ //Si le caractère courant est ")" => On a lu le vecteur en entier
                                String[] vRecopie = new String[vec.length]; //On recopie le tableau pour éviter les erreurs itératives
                                //System.out.println(vec.length);
                                System.arraycopy(vec, 0, vRecopie, 0, vec.length);
                                Vecteur v = new Vecteur(Integer.toString(h), vRecopie); //On crée un vecteur grâce au tableau
                                System.out.println(v.toString());
                                mat[h] = v; //On l'ajoute dans la famille
                                h++; 
                            }
                        }
                        i++;//On continue de lire la chaine
                    }
                    
                    //On créer l'application linéaire
                    ApplicationLineaire al = new ApplicationLineaire(lib, ed, ea, mat);
                    
                    //On sérialize l'application linéaire
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\projet_freyja\\donnees\\applicationsLineaires\\"+lib+".obj"));
                    oos.writeObject(al);
                    JOptionPane popup = new JOptionPane();
                    popup.showMessageDialog(null, "Application Linéaire créée", "Information", JOptionPane.INFORMATION_MESSAGE);
                    oos.close();
                    
                } catch (    IOException | ClassNotFoundException ex) {
                    Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
                }
                try {
                    //On tente de fermer le flux
                    ois.close();
                } catch (IOException ex) {
                    Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
                }
                
            } catch (IOException ex) {
                Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                //On tente de fermer le flux
                ois.close();
            } catch (IOException ex) {
                Logger.getLogger(WindowDefAL.class.getName()).log(Level.SEVERE, null, ex);
            } 
        }
    } 
}