
package projet_freyja.ihm;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import projet_freyja.math.EspaceVectoriel;
import projet_freyja.math.Polynome;

public class WindowDefPoly extends JFrame{
    
    //Attributs
    protected JLabel labelLibelle;
    protected JTextField libelle;
    protected JLabel labelEspaceDep;
    protected JComboBox espaceDep;
    protected JLabel labelEspaceArr;
    protected JComboBox espaceArr;
    protected JLabel labelDegre;
    protected JTextField degre;
    protected JLabel labelDefinition;
    protected JTextField definition;
    protected JButton boutonEnregistrer;
    
    public WindowDefPoly(){
        //Création de la fenêtre
        this.setTitle("New polynôme");
        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();
        labelDegre = new JLabel("Degré : ");
        degre = new JTextField("Entrez le degré");
        labelDefinition = new JLabel("Définition : ");
        definition = new JTextField("Entrez la définition");
        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);
            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(labelDegre);
            l4.add(degre);
            //l4.add(infini);
            
            //5eme ligne
            JPanel l5 = new JPanel();
            l5.setLayout(new BoxLayout(l5, BoxLayout.LINE_AXIS));
            l5.add(labelDefinition);
            l5.add(definition);
            
            //6eme ligne
            JPanel l6 = new JPanel();
            l6.setLayout(new BoxLayout(l6, BoxLayout.LINE_AXIS));
            l6.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);
            col.add(l6);
            
        //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 deg = Integer.parseInt(degre.getText()); 
            
            //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();
                    
                    //On construit sa définition
                    String coef;
                    int c;
                    int i = 0;
                    int k = 0;
                    double[] definition = new double[deg+1]; 
                    while(i < def.length()){
                        if(i == 0){
                            c = i;
                            while(def.charAt(c) != 42){
                                c++;
                            }
                            coef = def.substring(i, c);
                            definition[0] = Double.parseDouble(coef);
                            k++;
                            i = c;
                        }
                        else{
                           if(k != deg){
                            if(def.charAt(i) == 43 || def.charAt(i) == 45){
                                c = i;
                                while(def.charAt(c) != 42){
                                    c++;
                                }
                                coef = def.substring(i, c);
                                definition[k] = Double.parseDouble(coef);
                                k++;
                                i = c;                
                            }
                           }
                           else{
                               if(def.charAt(i) == 43 || def.charAt(i) == 45){
                                   c = i;
                                   while(c != def.length()){
                                       c++;
                                   }
                                coef = def.substring(i, c);
                                definition[k] = Double.parseDouble(coef);
                               }
                           }
                        }
                        i++;
                    }
                    
                    //On créer l'application linéaire
                    Polynome p = new Polynome(lib, definition, deg, ed, ea);
                    
                    //On sérialize l'application linéaire
                    ObjectOutputStream oos = new ObjectOutputStream(new FileOutputStream("src\\projet_freyja\\donnees\\polynomes\\"+lib+".obj"));
                    oos.writeObject(p);
                    JOptionPane popup = new JOptionPane();
                    popup.showMessageDialog(null, "Polynôme créé", "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);
            }
        }
    }
    
}