
package projet_freyja.ihm;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.ObjectOutputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import projet_freyja.math.Base;
import projet_freyja.math.Vecteur;

public class WindowDefBase extends JFrame{
    
    //Attributs
    protected JLabel labelLibelle;
    protected JTextField libelle;
    protected JLabel labelDimension;
    protected JTextField dimension;
    //protected JRadioButton infinie;
    protected JLabel labelDimensionVec;
    protected JTextField dimensionVec;
    //protected JRadioButton infinieVec;
    protected JLabel labelFamille;
    protected JTextField famille;
    protected JButton boutonEnregistrer;
    
    public WindowDefBase(){
        //Création de la fenêtre
        this.setTitle("New base");
        this.setSize(800, 600);
        
        //Création des composants
        labelLibelle = new JLabel("Libellé : ");
        libelle = new JTextField("Entrez un libellé");
        labelDimension = new JLabel("Dimension : ");
        dimension = new JTextField("Entrez une dimension");
        //infinie = new JRadioButton("Infinie");
        labelDimensionVec = new JLabel("Dimension des vecteurs : ");
        dimensionVec = new JTextField("Entrez une dimension");
        //infinieVec = new JRadioButton("Infinie");
        labelFamille = new JLabel("Famille : ");
        famille = new JTextField("Entrez une famille de vecteurs");
        boutonEnregistrer = new JButton("Enregistrer");
        
        //Mise sur écoute du bouton
        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(labelDimension);
            l2.add(dimension);
            //l2.add(infinie);
            
            //3eme ligne
            JPanel l3 = new JPanel();
            l3.setLayout(new BoxLayout(l3, BoxLayout.LINE_AXIS));
            l3.add(labelDimensionVec);
            l3.add(dimensionVec);
            //l3.add(infinieVec);
            
            //4eme ligne
            JPanel l4 = new JPanel();
            l4.setLayout(new BoxLayout(l4, BoxLayout.LINE_AXIS));
            l4.add(labelFamille);
            l4.add(famille);
            
            //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();
            int dim = Integer.parseInt(dimension.getText()); //On converti la chaine en int
            int dimVec = Integer.parseInt(dimensionVec.getText()); //On converti la chaine en int
            String fam = famille.getText();
            Vecteur[] family = new Vecteur[dim];
            
            //Construction de la famille de vecteurs à partir de la chaine
            int i = 0;
            int k = 0;
            int h = 0;
            String nbr;
            int c;
            String[] vec = new String[dimVec];
            while(i < fam.length()){ //On parcours la chaine saisie
                if(fam.charAt(i) == 40){ //Si le caractère courant est "("
                    k = 0;
                    nbr = "";
                    c = i;
                    while(fam.charAt(c) != 44){ //Tant qu'on lit pas ","
                       if(fam.charAt(c) != 40 && fam.charAt(c) != 41){ //On s'assure que c'est pas un mauvais caractère
                            nbr += fam.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(fam.charAt(i) == 44){ //Si le caractère courant est ","
                    nbr = "";
                    c = i+1;
                    while(fam.charAt(c) != 44 && fam.charAt(c) != 41){//Tant qu'on lit pas "," ou ")"
                        if(fam.charAt(c) != 40){ //On s'assure que c'est pas un mauvais caractère
                            nbr += fam.charAt(c); //On mémorise les chiffres
                        }
                        c++;
                    }
                    vec[k] = nbr; //On ajoute les chiffres dans le tableau
                    k++;
                    if(fam.charAt(c) == 41){ //Si le caractère courant est ")" => On a lu le vecteur en entier
                        String[] vRecopie = new String[dimVec]; //On recopie le tableau pour éviter les erreurs itératives
                        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
                        family[h] = v; //On l'ajoute dans la famille
                        h++; 
                    }
                }
                i++;//On continue de lire la chaine
            }

            //On créer la base
            Base b = new Base(lib, family, dim, dimVec);
            
            //Sérialisation
            ObjectOutputStream oos = null;
            try {
                //On tente d'ouvrir le fichier
                oos = new ObjectOutputStream(new FileOutputStream("src\\projet_freyja\\donnees\\bases\\"+lib+".obj"));
            } catch (FileNotFoundException ex) {
                Logger.getLogger(WindowDefBase.class.getName()).log(Level.SEVERE, null, ex);
            } catch (IOException ex) {
                Logger.getLogger(WindowDefBase.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                //On tente de sérialiser la base
                oos.writeObject(b);
                JOptionPane popup = new JOptionPane();
                popup.showMessageDialog(null, "Base créée", "Information", JOptionPane.INFORMATION_MESSAGE);
            } catch (IOException ex) {
                Logger.getLogger(WindowDefBase.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                //On tente de fermer le flux
                oos.close();
            } catch (IOException ex) {
                Logger.getLogger(WindowDefBase.class.getName()).log(Level.SEVERE, null, ex);
            }
        }       
    }
}