package view.article;

import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Vector;

import javax.swing.BoxLayout;
import javax.swing.JComboBox;
import javax.swing.JLabel;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.TreeNode;
import javax.swing.tree.TreePath;

import view.MainFrame;

import controller.BaseDonnees;
import controller.GestionArticle;

import model.article.Article;
import model.article.Nomenclature;

/**
 * ActionsClickDroit contient touts les listeners associes au click droit sur l'arbre
 * @see BaseDonnees#listeArticles
 * @author Magic Penguins
 */
public class ActionsClickDroit implements ActionListener {

	/**
	 * art est l'article selectionne par le click droit
	 */
	Article art;
	/**
	 * t1 est le noeud selectionne par le click droit
	 */
	TreeNode t1;
	/**
	 * arbre est l'arbre a modifier
	 */
	Arbre arbre;

	/**
	 * Constructeur de ActionsClickDroit
	 * @param arbre
	 * arbre a modifier
	 */
	public ActionsClickDroit(Arbre arbre) {
		this.arbre=arbre;
	}

	/**
	 * Modifie les parametres art et t1
	 * @param art
	 * @param t1
	 */
	public void setParam(Article art, TreeNode t1) {
		this.art=art;
		this.t1=t1;
	}

	/**
	 * Listener qui permet d'actionner les bouttons du click droit pour supprimer et ajouter une nomenclature sur l'arbre
	 * Pour ajouter une nomenclature, on cree une nouvelle fenetre qui demande a l'utilisateur l'ajout d'un des articles possibles
	 */
	@Override
	public void actionPerformed(ActionEvent arg0) {		
		JMenuItem i = (JMenuItem)arg0.getSource();
		if(i.getText().equals("Supprimer")){
			TreePath path = arbre.getJTree().getSelectionPath();
			if ((path == null) || (path.getPathCount() <= 1)) {

				return;
			}
			else {
				RetourneArticleParent(t1).supprimerNomenclature(art.getReference());
				((DefaultTreeModel) arbre.getJTree().getModel()).removeNodeFromParent((MutableTreeNode)t1);
			}
			IHM.a.getJTree().updateUI();
		}



		else if(i.getText().equals("Ajouter")){

			JPanel pane = new JPanel();
			pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
			JTextField qte = new JTextField();
			JComboBox liste = new JComboBox();
			qte.setPreferredSize(new Dimension(72, 26));

			Vector<String> interdis = new Vector<String>();
			interdis.clear();
			interdis = GestionArticle.trouverNoeudsPeres((DefaultMutableTreeNode)t1);
			Article futurPere = ((Nomenclature)(((DefaultMutableTreeNode)t1).getUserObject())).getArticle();

			boolean TransfertPossible = false;
			for(int tmp3=0; tmp3<BaseDonnees.listeArticles.size();tmp3++){
				TransfertPossible = GestionArticle.verifierAjout(futurPere, BaseDonnees.listeArticles.get(tmp3));
				if(TransfertPossible) liste.addItem(BaseDonnees.listeArticles.get(tmp3));
			}

			pane.add(new JLabel("Vous allez ajouter un article a la nomenclature, unnnnnbelievable !!"));
			JPanel globalPane = new JPanel();
			globalPane.add(new JLabel("Quantite voulue :"));
			globalPane.add(qte);
			pane.add(globalPane);
			pane.add(new JScrollPane(liste));

			int res = JOptionPane.showConfirmDialog(MainFrame.f, pane, "Ajout d'acrticle a la nomenclature", JOptionPane.OK_CANCEL_OPTION);
			if (res == JOptionPane.OK_OPTION) {
				try {
					if (qte.getText().trim().length() == 0) {
						JOptionPane.showMessageDialog(MainFrame.f, "Veuillez remplir tout les champs", "Erreur",JOptionPane.ERROR_MESSAGE);
						actionPerformed(arg0);
					}
					else {
						int quantite = Integer.parseInt(qte.getText());
						Article article = (Article)liste.getSelectedItem();
						DefaultTreeModel model = (DefaultTreeModel) arbre.getJTree().getModel();
						DefaultMutableTreeNode pere = new DefaultMutableTreeNode(new Nomenclature(article,quantite));

						model.insertNodeInto(pere, article.convertirArbre(), 0);
						String refparent;
						refparent = ((Nomenclature)((DefaultMutableTreeNode)t1).getUserObject()).getArticle().getReference();
						GestionArticle.getArticle(refparent).ajouterNomenclature(article.getReference(), quantite);

						IHM.p.removeAll();
						int[] selection = IHM.tableau.getSelectedRows();
						int indice=selection[0];
						IHM.a.setJTree(new JTree(BaseDonnees.listeArticles.get(indice).convertirArbre()));
						IHM.p.add(IHM.a.getJTree());
						IHM.a.getJTree().setVisible(true);
						IHM.a.getJTree().updateUI();
						IHM.p.updateUI();
					}
				} catch (NumberFormatException e) {
					JOptionPane.showMessageDialog(MainFrame.f, "Erreur dans le format d'entree", "Erreur",JOptionPane.ERROR_MESSAGE);
					actionPerformed(arg0);
				}
			}
		}
	}
	/**
	 * Fonction qui retourne l'article du noeud en parametre
	 * @param t
	 * Noeud fils du parent recherche
	 * @return l'article du noeud en parametre
	 */
	public static Article RetourneArticleParent(TreeNode t){
		return ((Nomenclature)((DefaultMutableTreeNode)t.getParent()).getUserObject()).getArticle();
	}
}
