package client.view.admin.gestionGroup;

//------------------------------------Importations des différentes bibliothèques---------------------------------//

import client.Application;
import client.ApplicationHelper;
import client.control.admin.EcouteurModifierGroupe;
import client.model.user.Role;
import client.model.user.Utilisateur;
import client.control.Command;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import client.view.admin.gestionGroup.button.ButtonAnnulerModifierGroup;
import client.view.admin.gestionGroup.button.ButtonValiderModifierGroup;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;

//-----------------------------------Fin Importations des différentes bibliothèques------------------------------//






//-------------------------------------------------Début de la classe------------------------------------------------//

/**<u><b>Explication générale de la classe :</b></u>
 * <P>Cette classe permet de modifier un groupe.
 *
 * @author Dream Team - ING2
 */
public class PanelModifierGroupe extends JPanel implements ActionListener {

    //Déclaration des variables.
    private static PanelModifierGroupe panSingleton = null;
    protected TitledBorder titleInfo;
    protected JLabel titreGroupe, titreRespoGroupe;
    private JTextField nomGroupe;
    private JComboBox userBox;
    private String ancienGroupe;

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de créer un singleton du panel modifier un groupe
     * 
     * @return une unique instance du panel modifier un groupe
     * 
     */
    public static PanelModifierGroupe getInstance(){
        if(panSingleton == null){
            panSingleton = new PanelModifierGroupe();
        }
        return panSingleton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P>Constructeur permettant de créer le panel contenant l'ensemble des onglets.
     * @param admin Objet de type PanelAdmin permettant de récupérer le panel et d'effectuer l'intéraction avec les listeners
     */
    private PanelModifierGroupe(){
        
        //Titre du Panel
        titleInfo = new TitledBorder("Modifier groupe");
        titleInfo.setTitleColor(Color.BLUE);
        this.setBorder(BorderFactory.createMatteBorder(2, 2, 2, 2, Color.BLUE));
        this.setBorder(BorderFactory.createTitledBorder(titleInfo));

        this.setBackground(new Color(234, 232, 233));

        //Nom du groupe
        titreGroupe = new JLabel("Nom du groupe :");
        titreGroupe.setBounds(50, 50, 135, 15);
        add(titreGroupe);

        nomGroupe = new JTextField(25);
        nomGroupe.setBounds(50, 70, 250, 20);
        add(nomGroupe);

        //Responsable du groupe
        titreRespoGroupe = new JLabel("Responsable du groupe :");
        titreRespoGroupe.setBounds(50, 130, 150, 20);
        add(titreRespoGroupe);

        userBox = new JComboBox();
        userBox.setBounds(50, 160, 250, 20);
        userBox.setBackground(new Color(234, 232, 233));
        add(userBox);

        //Listener
        EcouteurModifierGroupe modifierGroupeListener = new EcouteurModifierGroupe();

        //Annuler
        ButtonAnnulerModifierGroup bamg = new ButtonAnnulerModifierGroup(this);
        add(bamg);

        //Valider
        ButtonValiderModifierGroup bvmg = new ButtonValiderModifierGroup(this);
        bvmg.setActionCommand(EcouteurModifierGroupe.VALIDER);
        bvmg.addActionListener(modifierGroupeListener);
        add(bvmg);
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le nom de l'ancien groupe
     * 
     * @return le nom de l'ancien groupe
     * 
     */
    public String getAncienGroupe() {
        return ancienGroupe;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de mettre une nouvelle valeur à l'ancien nom du groupe
     * 
     * @param ancienGroupe nouvelle valeur à l'ancien nom du groupe
     * 
     */
    public void setAncienGroupe(String ancienGroupe) {
        this.ancienGroupe = ancienGroupe;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer la JComboBox des utilisateurs
     * 
     * @return la JComboBox des utilisateurs
     * 
     */
    public JComboBox getUserBox() {
        return userBox;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField du nom de groupe
     * 
     * @return le JTextField du nom de groupe
     * 
     */
    public JTextField getNomGroupe() {
        return nomGroupe;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le singleton du panel modifier un groupe
     * 
     * @return le singleton du panel modifier un groupe
     * 
     */
    public static PanelModifierGroupe getPanSingleton() {
        return panSingleton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de mettre une nouvelle référence du singleton du panel modifier un groupe
     * 
     * @param panSingleton nouvelle référence du singleton du panel modifier un groupe
     * 
     */
    public static void setPanSingleton(PanelModifierGroupe panSingleton) {
        PanelModifierGroupe.panSingleton = panSingleton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de remplir la JComboBox utilisateurs
     * 
     */
    public void remplirUserBoxRespoGroupe(){
        
        if(ancienGroupe != null){
            userBox.removeAllItems();
            userBox.addItem("-------------------------------------------------------");
            
	        int idGroup = Application.getInstance().getGroupe(ancienGroupe).getIdGroupe();
	        Map<Integer,Utilisateur> arrayUsersOfGroup = ApplicationHelper.UsersOfGroup(idGroup);
	
	        for(Iterator<Utilisateur> j = arrayUsersOfGroup.values().iterator() ;j.hasNext();){
	        	
	        	Utilisateur u = j.next();
	        	
	            Role role = u.getRolePersonne();
	            if(role == null){
	                int idUser = u.getIdPersonne();
	
	                //On met en majuscule le responsable du groupe
	                if(ApplicationHelper.UserHaveGoodRole(idUser, idGroup, Role.IDRESPONSABLE)){
	                    userBox.addItem(u.getLogin().toUpperCase());
	                }else{
	                    userBox.addItem(u.getLogin());
	                }
	            }
	        }
        }
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'effectuer la fonction "execute" lorsqu'il y a une action
     * 
     * @param e Evènement souris
     * 
     */
    public void actionPerformed(ActionEvent e) {
        Command c = (Command)e.getSource();
        c.execute();
    }

}

//---------------------------------------------------Fin de la classe-------------------------------------------------//
