package client.view.admin.gestionUser;

//------------------------------------Importations des différentes bibliothèques---------------------------------//
import client.Application;
import client.ApplicationHelper;
import client.control.admin.EcouteurCreerMembre;
import client.model.group.Groupe;
import client.control.Command;
import java.awt.Color;
import java.awt.event.ActionEvent;
import javax.swing.BorderFactory;
import javax.swing.JCheckBox;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.border.TitledBorder;
import client.view.admin.gestionUser.button.ButtonAnnulerCreerUser;
import client.view.admin.gestionUser.button.ButtonValiderCreerUser;
import java.awt.event.ActionListener;
import java.util.Iterator;
import java.util.Map;
import javax.swing.JComboBox;

//-----------------------------------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 concernant la création d'un utilisateur par un administrateur.
 *
 * @author Dream Team - ING2
 */
public class PanelCreerUser extends JPanel implements ActionListener {

    //Déclarations des variables.
    private static PanelCreerUser panSingleton = null;
    protected TitledBorder titleInfo;
    private JTextField nom, prenom, adresse, ville, codePostal, telephone, email, login, password, reponse;
    protected JLabel titreNom, titrePrenom, titreAdresse, titreVille, titreCP, titreTel, titreEmail, titreLogin, titrePassword, titreReponse, titreCU, titreGroupeAssigner;
    protected JCheckBox check;
    protected JComboBox groupBox;

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

    /**<u><i>Explication de la méthode :</i></u>
     * <P>Constructeur permettant de gérer la création d'un utilisateur.
     */
    private PanelCreerUser() {

    	//On met le layout à null
        setLayout(null);

        //Titre
        titleInfo = new TitledBorder("Créer 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));

        //Nom
        titreNom = new JLabel("Nom : ");
        titreNom.setBounds(50, 30, 50, 20);
        add(titreNom);
        nom = new JTextField(25);
        nom.setBounds(130, 30, 200, 20);
        add(nom);

        //Prenom
        titrePrenom = new JLabel("Prénom : ");
        titrePrenom.setBounds(50, 50, 60, 20);
        add(titrePrenom);
        prenom = new JTextField();
        prenom.setBounds(130, 50, 200, 20);
        add(prenom);

        //Adresse
        titreAdresse = new JLabel("Adresse : ");
        titreAdresse.setBounds(50, 70, 60, 20);
        add(titreAdresse);
        adresse = new JTextField();
        adresse.setBounds(130, 70, 200, 20);
        add(adresse);

        //Ville
        titreVille = new JLabel("Ville : ");
        titreVille.setBounds(50, 90, 60, 20);
        add(titreVille);
        ville = new JTextField();
        ville.setBounds(130, 90, 200, 20);
        add(ville);

        //Code Postal
        titreCP = new JLabel("Code Postal : ");
        titreCP.setBounds(50, 110, 80, 20);
        add(titreCP);
        codePostal = new JTextField();
        codePostal.setBounds(130, 110, 200, 20);
        add(codePostal);

        //Telephone
        titreTel = new JLabel("Téléphone : ");
        titreTel.setBounds(50, 130, 80, 20);
        add(titreTel);
        telephone = new JTextField();
        telephone.setBounds(130, 130, 200, 20);
        add(telephone);

        //Email
        titreEmail = new JLabel("E mail : ");
        titreEmail.setBounds(50, 150, 60, 20);
        add(titreEmail);
        email = new JTextField();
        email.setBounds(130, 150, 200, 20);
        add(email);

        //Login
        titreLogin = new JLabel("Login : ");
        titreLogin.setBounds(50, 170, 60, 20);
        add(titreLogin);
        login = new JTextField();
        login.setBounds(130, 170, 200, 20);
        add(login);

        //Password
        titrePassword = new JLabel("Password : ");
        titrePassword.setBounds(50, 190, 80, 20);
        add(titrePassword);
        password = new JTextField();
        password.setBounds(130, 190, 200, 20);
        add(password);

        //Groupe à assigner
        titreGroupeAssigner = new JLabel("Groupe : ");
        titreGroupeAssigner.setBounds(50, 210, 80, 20);
        add(titreGroupeAssigner);
        groupBox = new JComboBox();
        remplirGroupeBox();
        groupBox.setBounds(130, 210, 200, 20);
        add(groupBox);

        //Controleur
        EcouteurCreerMembre creerMembreListener = new EcouteurCreerMembre();

        //Valider
        ButtonValiderCreerUser bvcu = new ButtonValiderCreerUser(this);
        bvcu.setActionCommand(EcouteurCreerMembre.VALIDER);
        bvcu.addActionListener(creerMembreListener);
        add(bvcu);

        //Annuler
        ButtonAnnulerCreerUser bacu = new ButtonAnnulerCreerUser(this);
        add(bacu);
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField d'adresse
     * 
     * @return l'adresse de l'utilisateur
     * 
     */
    public JTextField getAdresse() {
        return adresse;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField d'adresse
     * 
     * @param adresse nouvelle valeur du JTextField d'adresse
     * 
     */
    public void setAdresse(JTextField adresse) {
        this.adresse = adresse;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField du code postal
     * 
     * @return le code postal de l'utilisateur
     * 
     */
    public JTextField getCodePostal() {
        return codePostal;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField code postal
     * 
     * @param codePostal nouvelle valeur du JTextField code postal
     * 
     */
    public void setCodePostal(JTextField codePostal) {
        this.codePostal = codePostal;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField d'email
     * 
     * @return email de l'utilisateur
     * 
     */
    public JTextField getEmail() {
        return email;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField d'email
     * 
     * @param email nouvelle valeur du JTextField d'email
     * 
     */
    public void setEmail(JTextField email) {
        this.email = email;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField login
     * 
     * @return login de l'utilisateur
     * 
     */
    public JTextField getLogin() {
        return login;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField login
     * 
     * @param login nouvelle valeur du JTextField login
     * 
     */
    public void setLogin(JTextField login) {
        this.login = login;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField nom
     * 
     * @return nom de l'utilisateur
     * 
     */
    public JTextField getNom() {
        return nom;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField nom
     * 
     * @param nom nouvelle valeur du JTextField nom
     * 
     */
    public void setNom(JTextField nom) {
        this.nom = nom;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField password
     * 
     * @return password de l'utilisateur
     * 
     */
    public JTextField getPassword() {
        return password;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField password
     * 
     * @param password nouvelle valeur du JTextField password
     * 
     */
    public void setPassword(JTextField password) {
        this.password = password;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField prénom
     * 
     * @return prénom de l'utilisateur
     * 
     */
    public JTextField getPrenom() {
        return prenom;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField prénom
     * 
     * @param prenom nouvelle valeur du JTextField d'adresse prénom
     * 
     */
    public void setPrenom(JTextField prenom) {
        this.prenom = prenom;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer la réponse 
     * 
     * @return réponse de l'utilisateur
     * 
     */
    public JTextField getReponse() {
        return reponse;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField réponse
     * 
     * @param reponse nouvelle valeur du JTextField réponse
     * 
     */
    public void setReponse(JTextField reponse) {
        this.reponse = reponse;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField téléphone
     * 
     * @return téléphone de l'utilisateur
     * 
     */
    public JTextField getTelephone() {
        return telephone;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField téléphone
     * 
     * @param telephone nouvelle valeur du JTextField téléhone
     * 
     */
    public void setTelephone(JTextField telephone) {
        this.telephone = telephone;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de récupérer le JTextField ville
     * 
     * @return ville de l'utilisateur
     * 
     */
    public JTextField getVille() {
        return ville;
    }
    
    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet d'assigner une nouvelle valeur du JTextField ville
     * 
     * @param ville nouvelle valeur du JTextField ville
     * 
     */
    public void setVille(JTextField ville) {
        this.ville = ville;
    }

    /**<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 singleton du panel créer un utilisateur
     * 
     * @return le singleton du panel créer un utilisateur
     * 
     */
    public static PanelCreerUser 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 créer utilisateur
     * 
     * @param panSingleton une nouvelle référence de singleton du panel créer un utilisateur
     * 
     */
    public static void setPanSingleton(PanelCreerUser panSingleton) {
        PanelCreerUser.panSingleton = panSingleton;
    }

    /**<u><i>Explication de la méthode :</i></u>
     * <P> Cette méthode permet de remplir les groupes dans la JComboBox
     * 
     */
    private 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-------------------------------------------------//
