package client.view.admin.gestionGroup;

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

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BorderFactory;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.border.TitledBorder;

import client.Application;
import client.control.Command;
import client.control.admin.EcouteurGroupe;
import client.control.admin.EcouteurMembreAttente;
import client.control.admin.EcouteurSupprimerGroupe;
import client.control.group.EcouteurBoxGroupe;
import client.model.group.Groupe;
import client.model.user.Utilisateur;
import client.view.admin.gestionGroup.button.ButtonAccepterUser;
import client.view.admin.gestionGroup.button.ButtonModifierGroup;
import client.view.admin.gestionGroup.button.ButtonRefuserUser;
import client.view.admin.gestionGroup.button.ButtonSupprimerGroup;

//-----------------------------------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 gérer le panel qui gère un groupe.
 *
 * @author Dream Team - ING2
 */
public class PanelGestionGroupe extends JPanel implements ActionListener {

    //Déclaration des variables.
    private static PanelGestionGroupe panSingleton = null;
    private TitledBorder titleInfo;
    private JLabel titreGroup, titrePendingUser;
    private JComboBox groupBox, userPendingBox;
    private ButtonAccepterUser bau;
    private ButtonModifierGroup bmg;
    private ButtonRefuserUser bru;
    private ButtonSupprimerGroup bsg;    

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

    /**<u><i>Explication de la méthode :</i></u>
     * <P>Constructeur du panel permettant de gérer un groupe en tant qu'administrateur.
     * @param admin Objet de type PanelAdmin permettant de récupérer le panel et d'effectuer l'intéraction avec les listeners
     */
    private PanelGestionGroupe(){

        //Titre du Panel
        titleInfo = new TitledBorder("Gestion 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));

        //Groupe
        titreGroup = new JLabel("Groupe :");
        titreGroup.setBounds(50, 50, 135, 15);
        add(titreGroup);

        groupBox = new JComboBox();
        remplirGroupeBox();
        groupBox.setBounds(50, 70, 250, 20);
        groupBox.addItemListener(new EcouteurBoxGroupe());
        add(groupBox);

        //Modifier
        bmg = new ButtonModifierGroup(this);
        bmg.addActionListener(new EcouteurGroupe());
        add(bmg);

        //Supprimer
        bsg = new ButtonSupprimerGroup(this);
        bsg.addActionListener(new EcouteurSupprimerGroupe());
        add(bsg);

        //Membre en attente
        titrePendingUser = new JLabel("Membre en attente :");
        titrePendingUser.setBounds(50, 260, 135, 15);
        add(titrePendingUser);

        userPendingBox = new JComboBox();
        remplirUserPendingBox();
        userPendingBox.setBounds(50, 280, 250, 20);
        add(userPendingBox);

        EcouteurMembreAttente membreAttenteListener = new EcouteurMembreAttente();

        //Accepter
        bau = new ButtonAccepterUser(this);
        bau.setActionCommand("ACCEPTER");
        bau.addActionListener(membreAttenteListener);
        add(bau);

        //Refuser
        bru = new ButtonRefuserUser(this);
        bru.setActionCommand("REFUSER");
        bru.addActionListener(membreAttenteListener);
        add(bru);

    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer la JComboBox des groupes
     * 
     * @return la JComboBox des groupes
     * 
     */
    public JComboBox getGroupBox() {
        return groupBox;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer la JComboBox des utilisateurs en attente
     * 
     * @return la JComboBox des utilisateurs en attente
     * 
     */
    public JComboBox getUserPendingBox() {
        return userPendingBox;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le singleton du panel gestion de groupe
     * 
     * @return le singleton du panel gestion de groupe
     * 
     */
    public static PanelGestionGroupe 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 gestion de groupe
     * 
     * @param panSingleton nouvelle référence du singleton du panel gestion de groupe
     * 
     */
    public static void setPanSingleton(PanelGestionGroupe panSingleton) {
        PanelGestionGroupe.panSingleton = panSingleton;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de remplir la JComboBox des groupes
     * 
     */
    public final void remplirGroupeBox(){
        groupBox.addItem("--------------------------------------------");
        for(Groupe group : Application.getInstance().getGroupes()){
            groupBox.addItem(group.getNomGroupe());
        }
        groupBox.addItem("--------------------------------------------");
        groupBox.addItem("Créer un groupe");
    }
   
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de remplir la JComboBox des utilisateurs en attente
     * 
     */
    public final void remplirUserPendingBox(){
        userPendingBox.removeAllItems();
        userPendingBox.addItem("-------------------------------------------------------");

        for(Utilisateur user : Application.getInstance().getUsersPending()){
            userPendingBox.addItem(user.getLogin());
        }
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de supprimer les éléments de la JComboBox des groupes
     * 
     */
    public final void deleteItemOfGroupBox(int size){
        for(int i=size-1; i>=0; i--){
            groupBox.removeItemAt(i);
        }
    }

    /**<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-------------------------------------------------//
