package client.view.admin.gestionUser;

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

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;

import javax.swing.BorderFactory;
import javax.swing.ButtonGroup;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JRadioButton;
import javax.swing.border.TitledBorder;

import client.Application;
import client.ApplicationHelper;
import client.control.Command;
import client.control.admin.EcouteurAssignation;
import client.control.admin.EcouteurAssignationButton;
import client.model.group.Groupe;
import client.view.admin.gestionUser.button.ButtonAnnulerAssignerUser;
import client.view.admin.gestionUser.button.ButtonValiderAssignerUser;

//-----------------------------------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 assigne un rôle à un utilisateur.
 *
 * @author Dream Team - ING2
 */
public class PanelAssignerUser extends JPanel implements ActionListener {

    //Déclaration des variables.
    private static PanelAssignerUser panSingleton = null;
    private TitledBorder titleInfo;
    private JLabel titreRole, titreGroupe;
    private JRadioButton adminButton, respoButton, membreButton, nouveauButton;
    private ButtonGroup groupGURole;
    private JComboBox groupBox;
    private JButton validate, cancel;
    private int membreChoisi;

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

    /**<u><i>Explication de la méthode :</i></u>
     * <P>Constructeur permettant de gérer le panel qui assigne un rôle à un utilisateur.
     */
    private PanelAssignerUser(){
        
        //Titre du Panel
        titleInfo = new TitledBorder("Assigner Utilisateur");
        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));

        //Role
        titreRole = new JLabel("Le rôle de :");
        titreRole.setBounds(50, 50, 135, 20);
        add(titreRole);

        //Administrateur
        adminButton = new JRadioButton("Administrateur");
        adminButton.setBounds(50, 80, 150, 20);
        adminButton.setBackground(new Color(234, 232, 233));
        adminButton.setSelected(true);

        //Responsable du Groupe
        respoButton = new JRadioButton("Responsable Groupe");
        respoButton.setBounds(50, 110, 170, 20);
        respoButton.setBackground(new Color(234, 232, 233));

        //Membre
        membreButton = new JRadioButton("Membre");
        membreButton.setBounds(50, 140, 170, 20);
        membreButton.setBackground(new Color(234, 232, 233));
        
        //Nouveau Rôle
        nouveauButton = new JRadioButton("Nouveau Rôle...");
        nouveauButton.setBounds(50, 170, 150, 20);
        nouveauButton.setBackground(new Color(234, 232, 233));

        //Groupe
        titreGroupe = new JLabel("Dans le Groupe :");
        titreGroupe.setBounds(50, 200, 135, 20);
        titreGroupe.setVisible(false);
        add(titreGroupe);

        //Box des groupes
        groupBox = new JComboBox();
        remplirGroupeBox();
        groupBox.setBounds(50, 230, 150, 20);
        groupBox.setVisible(false);
        groupBox.setBackground(new Color(234, 232, 233));
        add(groupBox);

        //On met les JRadioButton ensemble afin qu'ils n'aient qu'un sélection possible.
        groupGURole = new ButtonGroup();
        groupGURole.add(adminButton);
        groupGURole.add(respoButton);
        groupGURole.add(membreButton);
        groupGURole.add(nouveauButton);

        //Listener
        EcouteurAssignationButton assignationButtonListener = new EcouteurAssignationButton(this);

        adminButton.addActionListener(assignationButtonListener);
        adminButton.setActionCommand(EcouteurAssignationButton.ADMINISTRATEUR);
        respoButton.addActionListener(assignationButtonListener);
        respoButton.setActionCommand(EcouteurAssignationButton.RESPONSABLE);
        membreButton.addActionListener(assignationButtonListener);
        membreButton.setActionCommand(EcouteurAssignationButton.MEMBRE);
        nouveauButton.addActionListener(assignationButtonListener);
        nouveauButton.setActionCommand(EcouteurAssignationButton.NOUVEAU);

        //On ajoute les boutons
        add(adminButton);
        add(respoButton);
        add(membreButton);
        add(nouveauButton);

        //Listener
        EcouteurAssignation assignationListener = new EcouteurAssignation();

        //Valider
        ButtonValiderAssignerUser bvau = new ButtonValiderAssignerUser(this);
        bvau.setActionCommand(EcouteurAssignation.VALIDER);
        bvau.addActionListener(assignationListener);
        add(bvau);

        //Annuler
        ButtonAnnulerAssignerUser baau = new  ButtonAnnulerAssignerUser(this);
        add(baau);
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le bouton cancel
     * 
     * @return le bouton cancel
     * 
     */
    public JButton getCancel() {
        return cancel;
    }

    /**<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 le bouton valider
     * 
     * @return le bouton valider
     * 
     */
    public JButton getValidate() {
        return validate;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer si cette option a été choisie
     * 
     * @return le bouton selectionné ou non
     * 
     */
    public JRadioButton getAdminButton() {
        return adminButton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer si cette option a été choisie
     * 
     * @return le bouton selectionné ou non
     * 
     */
    public JRadioButton getRespoButton() {
        return respoButton;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer si cette option a été choisie
     * 
     * @return le bouton selectionné ou non
     * 
     */
    public JRadioButton getMembreButton() {
        return membreButton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer si cette option a été choisie
     * 
     * @return le bouton selectionné ou non
     * 
     */
    public JRadioButton getNouveauButton() {
        return nouveauButton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le titre du groupe (label)
     * 
     * @return le titre du groupe (label)
     * 
     */
    public JLabel getTitreGroupe() {
        return titreGroupe;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer l'id du membre choisi
     * 
     * @return l'id du membre choisi
     * 
     */
    public int getMembreChoisi() {
        return membreChoisi;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de mettre une nouvelle valeur de l'id du membre choisi
     * 
     * @param membreChoisi nouvelle valeur de l'id du membre choisi
     * 
     */
    public void setMembreChoisi(int membreChoisi) {
        this.membreChoisi = membreChoisi;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer l'array des boutons des rpoles
     * 
     * @return l'id du membre choisi
     * 
     */
    public ButtonGroup getGroupGURole() {
        return groupGURole;
    }

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

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de mettre une nouvelle référence de singleton du panel assigner utilisateur
     * 
     * @param panSingleton une nouvelle référence de singleton du panel admin
     * 
     */
    public static void setPanSingleton(PanelAssignerUser panSingleton) {
        PanelAssignerUser.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.removeAllItems();
        groupBox.addItem("------------------------------");

        Map<Integer,Groupe> arrayGroupsOfUser = ApplicationHelper.GroupsOfUser(Application.idSelect);
        for(Iterator<Groupe> i = arrayGroupsOfUser.values().iterator();i.hasNext();){
            groupBox.addItem(i.next().getNomGroupe());
        }
    }

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