package view.gammeOperatoire;

import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.BoxLayout;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.UIManager;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import model.article.Article;
import model.gammeOperatoire.GammeOperatoire;

import controller.BaseDonnees;
import controller.GestionCommande;
import view.MainFrame;


/**
 * Gere le menu permetant de gerer et d'ajouter des gammes operatoires a la commande actuelle 
 * @author Magic Penguins
 * @see MainFrame
 *
 */
public class ViewCommande implements ActionListener, ListSelectionListener{
	private static JPanel optionPane=new JPanel();
	private static DefaultListModel modelListeGamme = new DefaultListModel();
	private static JList listeGamme;

	/**
	 * Renvoie un {@link JPanel} contenant tout les element du second onglet
	 * @return Jpanel de retour
	 */
	public JPanel view(){
		JPanel container = new JPanel(new BorderLayout());
		JPanel listeGammePane = new JPanel(new BorderLayout());
		listeGamme = new JList(modelListeGamme);

		JButton genererCommande = new JButton("Simuler Commande");
		JButton ajouterGamme = new JButton("Ajouter Gamme Existante");
		JButton supprimerGamme = new JButton("Supprimer Gamme");
		JButton retirerGamme = new JButton("Retirer Gamme");
		JButton nouvelleGamme = new JButton("Creer une Gamme");

		supprimerGamme.setMinimumSize(ajouterGamme.getPreferredSize());
		supprimerGamme.setMaximumSize(ajouterGamme.getPreferredSize());
		genererCommande.setMinimumSize(ajouterGamme.getPreferredSize());
		genererCommande.setMaximumSize(ajouterGamme.getPreferredSize());
		nouvelleGamme.setMaximumSize(ajouterGamme.getPreferredSize());
		nouvelleGamme.setMinimumSize(ajouterGamme.getPreferredSize());
		retirerGamme.setMaximumSize(ajouterGamme.getPreferredSize());
		retirerGamme.setMinimumSize(ajouterGamme.getPreferredSize());

		genererCommande.addActionListener(this);
		supprimerGamme.addActionListener(this);
		nouvelleGamme.addActionListener(this);
		ajouterGamme.addActionListener(this);
		retirerGamme.addActionListener(this);

		listeGamme.addListSelectionListener(this);

		JPanel buttonPane = new JPanel();
		buttonPane.setLayout(new BoxLayout(buttonPane, BoxLayout.PAGE_AXIS));
		buttonPane.add(ajouterGamme);
		buttonPane.add(retirerGamme);
		buttonPane.add(new JLabel(" "));
		buttonPane.add(nouvelleGamme);
		buttonPane.add(supprimerGamme);
		buttonPane.add(new JLabel(" "));
		buttonPane.add(genererCommande);

		listeGammePane.add(new JScrollPane(listeGamme), BorderLayout.CENTER);
		listeGammePane.add(buttonPane, BorderLayout.SOUTH);

		container.add(listeGammePane, BorderLayout.WEST);
		container.add(optionPane, BorderLayout.CENTER);
		return container;
	}



	/**
	 * Listener associe a la {@link JList} de gamme operatoire constituant la commande
	 */
	@Override
	public void valueChanged(ListSelectionEvent arg0) {
		if ((GammeOperatoire)listeGamme.getSelectedValue() != null) {
			ViewGOP.ViewGamme((GammeOperatoire)listeGamme.getSelectedValue(), optionPane);
			optionPane.updateUI();
		}
		else {
			optionPane.removeAll();
			optionPane.updateUI();
		}
	}

	/**
	 * Listener associe aux {@link JButton} situes sous la {@link JList}
	 */
	@Override
	public void actionPerformed(ActionEvent arg0) {
		if(((JButton)arg0.getSource()).getText().equals("Ajouter Gamme Existante")) {
			Object o = JOptionPane.showInputDialog(MainFrame.f, "Selectionnez une gamme operatoire existante", "Nouvelle Gamme Operatoire", JOptionPane.OK_CANCEL_OPTION, UIManager.getIcon("OptionPane.questionIcon"), BaseDonnees.listeGammes.toArray(), BaseDonnees.listeGammes.get(0));
			if (o != null) {
				GestionCommande.ajouterGamme((GammeOperatoire)o);
				modelListeGamme.addElement(o);
				listeGamme.updateUI();
				optionPane.updateUI();
			}
		}
		else if (((JButton)arg0.getSource()).getText().equals("Retirer Gamme")) {
			Object[] obj = listeGamme.getSelectedValues();
			if (obj != null) {
				for (Object o : obj) {
					modelListeGamme.removeElement(o);
					listeGamme.setSelectedIndex(-1);
					listeGamme.updateUI();
					optionPane.updateUI();
				}
			}
		}
		else if(((JButton)arg0.getSource()).getText().equals("Creer une Gamme")) {
			int i = JOptionPane.showConfirmDialog(MainFrame.f, "Est-ce une gamme d'assemblage ?","Nouvelle Gamme Operatoire", JOptionPane.YES_NO_OPTION);
			if (i != -1 ) {

				String s = (String)JOptionPane.showInputDialog(MainFrame.f, "Entrez le nom de la gamme", "Nouvelle Gamme Operatoire", JOptionPane.OK_CANCEL_OPTION, UIManager.getIcon("OptionPane.questionIcon"), null, null); 
				if (s != null) {
					if (s.trim().length() == 0){
						JOptionPane.showMessageDialog(MainFrame.f, "Vous devez entrer un nom valide", "Erreur",JOptionPane.ERROR_MESSAGE);
						actionPerformed(arg0);
					}
					else {
						GammeOperatoire gop = new GammeOperatoire(s, i==0);
						BaseDonnees.listeGammes.add(gop);
						GestionCommande.ajouterGamme(gop);
						modelListeGamme.addElement(gop);
						listeGamme.updateUI();
						optionPane.updateUI();
					}
				}
			}
		}
		else if(((JButton)arg0.getSource()).getText().equals("Supprimer Gamme")) {
			if (listeGamme.getSelectedIndex() != -1) {
				int choix = JOptionPane.showConfirmDialog(MainFrame.f, "Voulez vous vraiment supprimer de la base de donnee les gammes operatoires selectionnees ?", "Confirmer suppression", JOptionPane.YES_NO_OPTION);
				if (choix  == 0) {
					GestionCommande.supprimerGamme(((GammeOperatoire)listeGamme.getSelectedValue()).getReference());
					for (Object o : listeGamme.getSelectedValues()) {modelListeGamme.removeElement((GammeOperatoire)o);}
					listeGamme.setSelectedIndex(-1);
					listeGamme.updateUI();
					optionPane.updateUI();
				}
			}
		}
		else if(((JButton)arg0.getSource()).getText().equals("Simuler Commande")) {
			GestionCommande.calculerDelaiStochastique();
			GestionCommande.calculerDelaiStochastique();
			String str = "\n\nArticles en rupture de stock:\n";
			for (Article a : GestionCommande.listeRupture) {str+=a+"\n";}
			JOptionPane.showMessageDialog(MainFrame.f, "--- CALCUL DE DELAIS ---\nDelai deterministe :\n" + GestionCommande.delaiDeterministe+"\nDelai stochastique :\n"+GestionCommande.delaiStochastique+str, "Calcul de delais", JOptionPane.OK_OPTION);

		}
	}

}
