package view.vueGestionArticle;

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.util.List;

import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JSeparator;

import database.dataset.Categorie_article;

import language.Francais;
import language.Language;
import tool.regEx.DataNormalizer;
import view.Formulaire;
import view.tool.inputField.JValidTextField;

/**
 * Interface destin�e � la gestion d'articles
 * @author Alfredo Toyo
 *
 */
public class VueGestionAjouterArticle extends Formulaire{
	private static final long serialVersionUID = -1863019945672776476L;
	
	private JPanel panelGestionArticle;

	private GridBagConstraints constraint;
	
	private Language langue;
	
	private JLabel labelCategorie
			  	  ,labelCode
			  	  ,labelDescription
			  	  ,labelTaxable
			  	  ,labelActif;
	
	private JValidTextField textFieldCode
						   ,textFieldDescription;
	
	private JCheckBox chkBoxTaxable
					 ,chkBoxActif;

	private JComboBox<String> comboBoxCategorie;
	
	private static final String AlphaNumericRegex = "[a-zA-Z0-9 -]";
	
	/**
	 * Constructeur
	 * @param langue
	 */
	public VueGestionAjouterArticle(Language langue) {
		super();
		this.langue = langue;
		initVariable();
		initComponents();
		initListener();
		setMnemonic();
	}

	/**
	 * Initialisation des attributs de la classe
	 */
	private void initVariable()
	{
		panelGestionArticle     = new JPanel(new GridBagLayout());
		
		constraint = new GridBagConstraints();

		labelCategorie       = new JLabel(langue.getGestionArticle_Categorie().replaceAll("%", ""));
		labelCode            = new JLabel(langue.getGestionArticle_Code().replaceAll("%", ""));
		labelDescription     = new JLabel(langue.getGestionArticle_Description().replaceAll("%", ""));
		labelTaxable         = new JLabel(langue.getGestionArticle_Taxable().replaceAll("%", ""));
		labelActif           = new JLabel(langue.getGestionArticle_Actif().replaceAll("%", ""));

		textFieldCode            = JValidTextField.JValidTextFieldAllowCertainCharacter(AlphaNumericRegex, 10);
		textFieldDescription     = JValidTextField.JValidTextFieldAllowCertainCharacter(AlphaNumericRegex, 16);

		chkBoxTaxable     = new JCheckBox();
		chkBoxActif   	  = new JCheckBox();
		
		comboBoxCategorie = new JComboBox<String>();
	}

	/**
	 * Initialisation des composants du formulaire
	 */
	private void initComponents(){
		/******************CHAMPS EDITABLES****************************/
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 0;
		panelGestionArticle.add(labelCategorie,constraint);
		
		constraint.fill    = GridBagConstraints.NONE;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 1;
		constraint.gridy   = 0;
		panelGestionArticle.add(comboBoxCategorie,constraint);
		
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 1;
		panelGestionArticle.add(labelCode,constraint);
		
		constraint.fill    = GridBagConstraints.NONE;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 1;
		constraint.gridy   = 1;
		panelGestionArticle.add(textFieldCode,constraint);
		
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 2;
		panelGestionArticle.add(labelDescription,constraint);
		
		constraint.fill    = GridBagConstraints.NONE;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 1;
		constraint.gridy   = 2;
		panelGestionArticle.add(textFieldDescription,constraint);
		
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 3;
		panelGestionArticle.add(labelTaxable,constraint);
		
		constraint.fill    = GridBagConstraints.NONE;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 1;
		constraint.gridy   = 3;
		panelGestionArticle.add(chkBoxTaxable,constraint);
		
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.anchor  = GridBagConstraints.NORTH;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 0.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 4;
		panelGestionArticle.add(labelActif,constraint);
		
		constraint.fill    = GridBagConstraints.NONE;
		constraint.anchor  = GridBagConstraints.NORTHWEST;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 1;
		constraint.gridy   = 4;
		panelGestionArticle.add(chkBoxActif,constraint);
		
		constraint.fill    = GridBagConstraints.HORIZONTAL;
		constraint.insets  = new Insets(10, 3, 10, 3);
		constraint.weightx = 1.0;
		constraint.weighty = 1.0;
		constraint.gridx   = 0;
		constraint.gridy   = 0;
		add(panelGestionArticle,constraint);
		/******************FIN CHAMPS EDITABLES**************************/	
	}
	
	/**
	 * Initialiser les listener pour les boutons Ajouter et annuler
	 */
	private void initListener(){		
		//buttonAjouter.addActionListener(this);
		//buttonAnnuler.addActionListener(this);
	}
	
	/**
	 * Setting des mnemonics
	 */	
	private void setMnemonic(){
		labelCategorie.setDisplayedMnemonic(langue.getGestionArticle_Categorie().charAt(langue.getGestionArticle_Categorie().indexOf('%')+1));
		labelCategorie.setLabelFor(comboBoxCategorie);
		
		labelCode.setDisplayedMnemonic(langue.getGestionArticle_Code().charAt(langue.getGestionArticle_Code().indexOf('%')+1));
		labelCode.setLabelFor(textFieldCode);
		
		labelDescription.setDisplayedMnemonic(langue.getGestionArticle_Description().charAt(langue.getGestionArticle_Description().indexOf('%')+1));
		labelDescription.setLabelFor(textFieldDescription);
		
		labelTaxable.setDisplayedMnemonic(langue.getGestionArticle_Taxable().charAt(langue.getGestionArticle_Taxable().indexOf('%')+1));
		labelTaxable.setLabelFor(chkBoxTaxable);
		chkBoxTaxable.setMnemonic(langue.getGestionArticle_Taxable().charAt(langue.getGestionArticle_Taxable().indexOf('%')+1));
		
		labelActif.setDisplayedMnemonic(langue.getGestionArticle_Actif().charAt(langue.getGestionArticle_Actif().indexOf('%')+1));
		labelActif.setLabelFor(chkBoxActif);
		chkBoxActif.setMnemonic(langue.getGestionArticle_Actif().charAt(langue.getGestionArticle_Actif().indexOf('%')+1));
	}
	
    /* getter */	
	/**
	 * Retourne la valeur du champ texte cat�gorie
	 * @return text
	 */
	public String getComboBoxCategorie(){
		if(comboBoxCategorie.getItemCount() == 0)
		{
			return "";
		}
		return DataNormalizer.normalize(comboBoxCategorie.getSelectedItem().toString());
	}
	
	/**
	 * Retourne la valeur du champ texte code
	 * @return text
	 */
	public String getTextFieldCode(){
		return DataNormalizer.normalize(textFieldCode.getText());
	}

	/**
	 * Retourne la valeur du champ texte description
	 * @return text
	 */
	public String getTextFieldDescription(){
		return DataNormalizer.normalize(textFieldDescription.getText());
	}
	
	/**
	 * Retourne la valeur boleenne du checkbox taxable
	 * @return text
	 */
	public boolean getChkBoxTaxable(){
		return chkBoxTaxable.isSelected();
	}
	
	/**
	 * Retourne la valeur booleenne du champ actif
	 * @return text
	 */
	public boolean getChkBoxActif(){
		return chkBoxActif.isSelected();
	}
	
	/* setter */
	/**
	 * Affectation d'une valeur texte au champ categorie
	 * @param text
	 */
	public void addComboBoxCategorie(String text){
		comboBoxCategorie.addItem((DataNormalizer.normalize(text)));
	}
	
	/* setter */
	/**
	 * Selection d'une valeur texte au champ categorie
	 * @param text
	 */
	public void setSelectedCategorie(String text){
		comboBoxCategorie.setSelectedItem(((DataNormalizer.normalize(text))));
	}
	
	/**
	 * Affectation d'une valeur texte au champ code
	 * @param text
	 */
	public void setTextFieldCode(String text){
		textFieldCode.setText(DataNormalizer.normalize(text));
	}
	
	/**
	 * Affectation d'une valeur texte au champ description
	 * @param text
	 */
	public void setTextFieldDescription(String text){
		textFieldDescription.setText(DataNormalizer.normalize(text));
	}
	
	/**
	 * Affectation d'une valeur boolenne au champ taxable
	 * @param selected
	 */
	public void setChkBoxTaxable(boolean selected) {
		this.chkBoxTaxable.setSelected(selected);
	}

	/**
	 * Affectation d'une valeur boolenne au champ actif
	 * @param selected
	 */
	public void setChkBoxActif(boolean selected) {
		this.chkBoxActif.setSelected(selected);
	}
	
	public void clearComboBoxCategorie()
	{
		comboBoxCategorie.removeAllItems();
	}
	
	/* setters on read only fields */
	/**
	 * Ajout des donn�es dans les champ en lecture seule
	 * @param categorie
	 * @param code
	 * @param description
	 * @param taxable
	 * @param actif
	 */
	public void AddDataToFields(List<Categorie_article> categories, String categorie, String code, String description, Boolean taxable, Boolean actif){
		
		for(int i=0;i<categories.size();i++)
		{
			addComboBoxCategorie(categories.get(i).getCategorie_article_description());
		}
		
		setSelectedCategorie(categorie);
		setTextFieldCode(code);
		setTextFieldDescription(description);
		setChkBoxTaxable(taxable);
		setChkBoxActif(actif);
	}
	
	/**
	 * �fface les informations de l'article en lecture seule
	 */
	public void ClearInfo(){
		if(comboBoxCategorie.getItemCount() != 0)
		{
			comboBoxCategorie.setSelectedIndex(0);
		}
		setTextFieldCode("");
		setTextFieldDescription("");
		setChkBoxTaxable(false);
		setChkBoxActif(false);
	}
	
	public boolean isInputDataValid()
	{
		if(textFieldCode.getText().isEmpty())
			return false;
		
		return true;
	}
	
	public void DisableModification()
	{
		comboBoxCategorie.setEditable(false);
		textFieldCode.setEditable(false);
		textFieldDescription.setEditable(false);
		chkBoxTaxable.setEnabled(false);
		chkBoxActif.setEnabled(false);
	}
	
	public void AbleModification()
	{
		comboBoxCategorie.setEditable(true);
		textFieldCode.setEditable(true);
		textFieldDescription.setEditable(true);
		chkBoxTaxable.setEnabled(true);
		chkBoxActif.setEnabled(true);
	}
	
	/**
	 * Le code du main est pour les fins de test d'affichage et ils peuvent �tre modifi�s ou effac�s
	 * @param args
	 */
	public static void main(String[] args) {
		JFrame a = new JFrame("window");
		VueGestionAjouterArticle fer = new VueGestionAjouterArticle(Francais.getInstance());
		a.setLayout(new GridBagLayout());
		
//		fer.AddDataToFields("categorie", "code", "description", true, false);
//		fer.ClearInfo();
		
		GridBagConstraints contraint = new GridBagConstraints();
		contraint.fill = GridBagConstraints.BOTH;
		contraint.weightx = 1.0;
		contraint.weighty = 1.0;
		contraint.gridx = 0;
		contraint.gridy = 0;
		
		a.add(fer,contraint);
		a.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		a.pack();
		a.setVisible(true);
	}
}
