package fr.iutfbleau.projetIHM2022FI2.MP.ROOT.Controller;

import java.awt.event.*;
import java.util.LinkedHashSet;
import fr.iutfbleau.projetIHM2022FI2.API.*;
import javax.swing.JOptionPane;
import fr.iutfbleau.projetIHM2022FI2.API.Groupe;
import fr.iutfbleau.projetIHM2022FI2.API.Model;
import fr.iutfbleau.projetIHM2022FI2.MP.ROOT.View.FenetreSelectionEtu;

import javax.swing.*;
import java.util.Set;
/**
 * le controller pour les groupes
 */
public class ObservateurModifGroupe implements ActionListener{
	//le model
    private Model m;
		//le groupe courant
    private Groupe groupe;
		/**
		 * le constructeur
		 * @param m le model
		 * @param g le groupe courant
		 */
    public ObservateurModifGroupe(Model m, Groupe g){
        this.m=m;
        this.groupe=g;
    }
		/**
		 * méthode invoquée lors d'un clic sur un bouton
		 * @param e l'événement
		 */
    @Override
    public void actionPerformed(ActionEvent e) {
        if(e.getActionCommand()=="supr"){
            this.m.delete(this.groupe);
        }
        if(e.getActionCommand()=="new Groupe"){
            String g[]=new String[2];
            g[0]="Partition";
            g[1]="Free";
            int rep=JOptionPane.showOptionDialog(m.getFenetre(), "Type du nouveau Groupe","Type", JOptionPane.YES_NO_OPTION, JOptionPane.QUESTION_MESSAGE, null, g, g[0]);
            if(rep==JOptionPane.YES_OPTION){
                try{

                    JPanel myPanel = new JPanel();
                    JTextField xField = new JTextField(5);
                    JTextField yField = new JTextField(20);
                    myPanel.add(new JLabel("Nombre:"));
                    myPanel.add(xField);
                    myPanel.add(Box.createHorizontalStrut(15));
                    myPanel.add(new JLabel("Nom:"));
                    myPanel.add(yField);
                    int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, 
                            "Entrer le nombre et le nom des Partitions", JOptionPane.OK_CANCEL_OPTION);
                    if (result == JOptionPane.OK_OPTION) {
                        int nb=Integer.parseInt(xField.getText());
                        if(nb>this.groupe.getEtudiants().size()){
                            JOptionPane.showMessageDialog(m.getFenetre(), "nombre de partition trop grand", "erreur", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                        m.partition(this.groupe, nb, yField.getText());
                    }
                }catch(NumberFormatException er){
                    JOptionPane.showMessageDialog(m.getFenetre(), "erreur dans le nombre de partition", "erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
            if(rep==JOptionPane.NO_OPTION){
                try{
                    JPanel myPanel = new JPanel();
                    JTextField xField = new JTextField(5);
                    JTextField zField = new JTextField(5);
                    JTextField yField = new JTextField(20);
                    myPanel.add(new JLabel("Nom:"));
                    myPanel.add(yField);
                    myPanel.add(Box.createHorizontalStrut(15));
                    myPanel.add(new JLabel("Min:"));
                    myPanel.add(xField);
                    myPanel.add(new JLabel("Max:"));
                    myPanel.add(zField);
                    int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, 
                            "Entrer le nombre et le nom des Partitions", JOptionPane.OK_CANCEL_OPTION);
                    if (result == JOptionPane.OK_OPTION) {
                        int min=Integer.parseInt(xField.getText());
                        int max=Integer.parseInt(zField.getText());
                        if(max>this.groupe.getMax() || min<=0 || max<=0 || min>max){
                            JOptionPane.showMessageDialog(m.getFenetre(), "nombre min/max inchoérent", "erreur", JOptionPane.ERROR_MESSAGE);
                            return;
                        }
                        Set<Etudiant> ajout=new LinkedHashSet<>();
                        myPanel=new FenetreSelectionEtu(this.groupe, ajout, false, m.getEtudiant());
                        if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){
                            if(ajout.size()>=min && ajout.size()<=max){
                                m.free(groupe, yField.getText(), min, max, ajout);
                            }else{
                                if(min>ajout.size())
                                    JOptionPane.showMessageDialog(m.getFenetre(), "nombre d'etudiant trop petit", "erreur", JOptionPane.ERROR_MESSAGE); 
                                else{
                                    JOptionPane.showMessageDialog(m.getFenetre(), "nombre d'etudiant trop grand", "erreur", JOptionPane.ERROR_MESSAGE); 
                                }
                            }
                        }
                    }
                }catch(NumberFormatException er){
                    JOptionPane.showMessageDialog(m.getFenetre(), "erreur dans les nombres min et max", "erreur", JOptionPane.ERROR_MESSAGE);
                }
            }
        }
        if(e.getActionCommand()=="rename"){
            JPanel myPanel = new JPanel();
            JTextField xField = new JTextField(50);
            myPanel.add(new JLabel("Nom:"));
            myPanel.add(xField);
            if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Nouveau Nom", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.OK_OPTION){
                if(xField.getText().length()==0){
                    JOptionPane.showMessageDialog(m.getFenetre(), "erreur nom null", "erreur", JOptionPane.ERROR_MESSAGE);
                }else{
                    m.rename(xField.getText(), this.groupe);
                }
            }
        }
        if(e.getActionCommand()=="add"){
            Set<Etudiant> ajout=new LinkedHashSet<>();
            JPanel myPanel=new FenetreSelectionEtu(this.groupe, ajout, true, this.m.getEtudiant());
            if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(myPanel), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){
                if(this.groupe.getMax()<this.groupe.getEtudiants().size()+ajout.size()){
                    JOptionPane.showMessageDialog(m.getFenetre(), "Il y a trop d'etudiant pour le groupe", "erreur", JOptionPane.ERROR_MESSAGE);
                    return;
                }
                int i=0;
                for(Etudiant et:ajout){
                    if(m.addEtudiant(this.groupe, et)==false){
                        i++;
                    }  
                }
                m.showGroupe(this.groupe);
                if(i>0){JOptionPane.showMessageDialog(m.getFenetre(), "erreur impossible d'ajouter "+i+" etudiants par manque de place dans le groupe de ses parents", "errer", JOptionPane.ERROR_MESSAGE);}
            }
        }
        if(e.getActionCommand()=="créer une promo"){
            try{
                JPanel myPanel = new JPanel();
                JTextField xField = new JTextField(5);
                JTextField zField = new JTextField(5);
                JTextField yField = new JTextField(20);
                myPanel.add(new JLabel("Nom:"));
                myPanel.add(yField);
                myPanel.add(Box.createHorizontalStrut(15));
                myPanel.add(new JLabel("Min:"));
                myPanel.add(xField);
                myPanel.add(new JLabel("Max:"));
                myPanel.add(zField);
                int result = JOptionPane.showConfirmDialog(m.getFenetre(), myPanel, 
                        "Entrer le nombre et le nom de la promo", JOptionPane.OK_CANCEL_OPTION);
                if (result == JOptionPane.OK_OPTION) {
                    int min=Integer.parseInt(xField.getText());
                    int max=Integer.parseInt(zField.getText());
                    if(zField.getText().length()==0){
                        JOptionPane.showMessageDialog(m.getFenetre(), "erreur entre un nom", "erreur", JOptionPane.ERROR_MESSAGE);
                    }else{
                        if(min>max){
                            JOptionPane.showMessageDialog(m.getFenetre(), "erreur min>max", "erreur", JOptionPane.ERROR_MESSAGE);
                        }else{
                            Set<Etudiant> ajout=new LinkedHashSet<>();
                            JPanel pan=new FenetreSelectionEtu(null, ajout, false, this.m.getEtudiant());
                            if(JOptionPane.showConfirmDialog(m.getFenetre(), new JScrollPane(pan), "Selectionner les étudiant a ajouter", JOptionPane.OK_CANCEL_OPTION) ==JOptionPane.YES_OPTION){
                                if(min>ajout.size() || max<ajout.size()){
                                    JOptionPane.showMessageDialog(m.getFenetre(), "Il y a trop/pas assez d'etudiant pour le groupe", "erreur", JOptionPane.ERROR_MESSAGE);
                                    return;
                                }
                                m.addPromo(min, max, yField.getText(), ajout);
                            }
                        }
                    }
                }
            }catch(NumberFormatException er){
                JOptionPane.showMessageDialog(m.getFenetre(), "erreur dans les nombres min et max", "erreur", JOptionPane.ERROR_MESSAGE);
            }
        }
    }
    
}
