package view.tool.inputField;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import javax.swing.JOptionPane;
import javax.swing.JPanel;

import tool.regEx.RegExFactory;

/******************************************************************************
 * InputField.java (Design Pattern)
 * 
 * Permet de creer des inputs qui vérifie leur contenu avec le regex et qui
 * gere l'affichage de message d'erreur
 *  
 * 
 * Projet Orford
 *****************************************************************************
 *modification
 *nom date     explication
 ****************************************************************************/

/**
*
* @author Jonathan Guertin
*/
public class InputField extends JPanel implements FocusListener{
	
	/**
	 * 
	 */
	private static final long serialVersionUID = 2364423563716025884L;
	private GridBagConstraints 	constraint;
	private JValidTextField input;
	private Pattern pattern;
	private String message;
	
	/**
	 * Constructeur 
	 * @param pat Pattern a utiliser pour faire la verification
	 * @param mess Message a afficher si une le text entrer n'est pas valide
	 */
	private InputField(Pattern pat, String mess){
		super(new GridBagLayout());
		constraint = new GridBagConstraints();
		pattern = pat;
		message = mess;
		input = JValidTextField.JValidTextFieldAllowCertainCharacter("[a-Z]",32);
		input.setColumns(30);
		
		constraint.fill = GridBagConstraints.BOTH;
		constraint.weightx = 1;
		constraint.weighty = 1;
		constraint.gridx = 0;
		constraint.gridy = 0;
		add(input,constraint);
	}
	
	/**
	 * static factory
	 * version pour le code postal
	 * @return InputField
	 */
	public static InputField verifCodePostal(RegExFactory champ){
		return new InputField(champ.codePostal(), champ.chaineCodePostal());
	}
	
	/**
	 * static factory
	 * version pour l'argent
	 * @return InputField
	 */
	public static InputField verifArgent(RegExFactory champ){
		return new InputField(champ.argent(), champ.chaineArgent());
	}
	
	/**
	 * static factory
	 * version pour la ville et la province
	 * @return InputField
	 */
	public static InputField verifVilleProvince(RegExFactory champ){
		return new InputField(champ.villeProvince(), champ.chaineVilleProvince());
	}
	
	/**
	 * static factory
	 * version pour le téléphone
	 * @return InputField
	 */
	public static InputField verifTelephone(RegExFactory champ){
		return new InputField(champ.telephone(), champ.chaineTelephone());
	}
	
	/**
	 * static factory
	 * version pour la date de la carte de crédit
	 * @return InputField
	 */
	public static InputField verifDateCarteCredit(RegExFactory champ){
		return new InputField(champ.dateCarteCredit(), champ.chaineDateCarteCredit());
	}
	
	public String getText()
	{
		return input.getText();
	}
	
	public void setText(String text)
	{
		input.setText(text);
	}
	
	@Override
	public void focusGained(FocusEvent arg0) {}

	@Override
	public void focusLost(FocusEvent arg0) {
		Matcher inputMatcher = pattern.matcher(input.getText());
        if(!inputMatcher.find())
        {
            JOptionPane.showMessageDialog(null, message);
            input.selectAll();
            input.requestFocus();
        }
	}
	
}
