package view.gammeOperatoire;

import java.awt.BorderLayout;
import java.awt.Dimension;
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.JDialog;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSeparator;
import javax.swing.JTextField;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;

import view.MainFrame;

import controller.BaseDonnees;
import controller.GestionPoste;

import model.posteCharge.Machine;
import model.posteCharge.Operateur;
import model.posteCharge.PosteCharge;
/**
 * Permet l'affichage en IHM et la modification des postes de charge et de ses composants (Operateurs et Machine) 
 * @author Magic Penguins
 *@see ViewGOP
 */
@SuppressWarnings("serial")
public class ViewPC extends JDialog implements ActionListener, ListSelectionListener{
	PosteCharge pc;
	DefaultListModel modelAvailableOperators = new DefaultListModel();
	DefaultListModel modelSelectedOperators = new DefaultListModel();
	DefaultListModel modelAvailableMachine = new DefaultListModel();
	DefaultListModel modelSelectedMachine = new DefaultListModel();

	JList availableOperators = new JList(modelAvailableOperators);
	JList selectedOperators = new JList(modelSelectedOperators);
	JList availableMachine = new JList(modelAvailableMachine);
	JList selectedMachine = new JList(modelSelectedMachine);

	JPanel optionPaneOperateur;
	JPanel optionPaneMachine;

	/**
	 * Constructeur
	 * @param pc
	 * Poste de charge a visionner
	 */
	public ViewPC(PosteCharge pc) {
		super(MainFrame.f, "Poste de Charge - "+pc.getNom(), true);
		this.setDefaultCloseOperation(DISPOSE_ON_CLOSE);
		this.setResizable(false);
		this.pc=pc;
		this.display();
	}

	/**
	 * Fonction permetant l'affichage de tout les parametres du poste de charge associe dans une {@link JDialog} separee
	 */
	public void display() {

		this.setLayout(new BoxLayout(getContentPane(), BoxLayout.PAGE_AXIS));

		JPanel panelOperators = new JPanel();
		JPanel panelMachine = new JPanel();

		for (Operateur o : BaseDonnees.listeOperateurs) {modelAvailableOperators.addElement(o);}
		for (Operateur o : pc.getOperateur()) {modelSelectedOperators.addElement(o);}

		availableOperators.setPreferredSize(new Dimension(250, 200));
		selectedOperators.setPreferredSize(new Dimension(250, 200));
		availableOperators.addListSelectionListener(this);
		selectedOperators.addListSelectionListener(this);
		availableOperators.setName("av1");
		selectedOperators.setName("se1");

		JPanel titleAvailableOperator = new JPanel();
		titleAvailableOperator.setLayout(new BorderLayout());
		titleAvailableOperator.add(new JLabel("Operateurs Disponibles"), BorderLayout.NORTH);
		titleAvailableOperator.add(new JScrollPane(availableOperators), BorderLayout.SOUTH);

		JPanel titleSelectedOperator = new JPanel();
		titleSelectedOperator.setLayout(new BorderLayout());
		titleSelectedOperator.add(new JLabel("Operateurs Assignes"), BorderLayout.NORTH);
		titleSelectedOperator.add(new JScrollPane(selectedOperators), BorderLayout.SOUTH);


		JPanel buttonPaneOperateur = new JPanel();
		buttonPaneOperateur.setLayout(new BorderLayout());
		optionPaneOperateur = optionButtonPane("1");
		buttonPaneOperateur.add(ButtonPane("1"), BorderLayout.PAGE_START);
		buttonPaneOperateur.add(optionPaneOperateur, BorderLayout.SOUTH);

		panelOperators.add(titleAvailableOperator);
		panelOperators.add(buttonPaneOperateur);
		panelOperators.add(titleSelectedOperator);

		for (Machine m : BaseDonnees.listeMachines) {modelAvailableMachine.addElement(m);}
		for (Machine m : pc.getMachine()) {modelSelectedMachine.addElement(m);}

		availableMachine.setPreferredSize(new Dimension(250, 200));
		selectedMachine.setPreferredSize(new Dimension(250, 200));
		availableMachine.addListSelectionListener(this);
		selectedMachine.addListSelectionListener(this);
		availableMachine.setName("av2");
		selectedMachine.setName("se2");

		JPanel titleAvailableMachine = new JPanel();
		titleAvailableMachine.setLayout(new BorderLayout());
		titleAvailableMachine.add(new JLabel("Machines Disponibles"), BorderLayout.NORTH);
		titleAvailableMachine.add(new JScrollPane(availableMachine), BorderLayout.SOUTH);

		JPanel titleSelectedMachine = new JPanel();
		titleSelectedMachine.setLayout(new BorderLayout());
		titleSelectedMachine.add(new JLabel("Machines Assignees"), BorderLayout.NORTH);
		titleSelectedMachine.add(new JScrollPane(selectedMachine), BorderLayout.SOUTH);

		JPanel buttonPaneMachine = new JPanel();
		buttonPaneMachine.setLayout(new BorderLayout());
		optionPaneMachine = optionButtonPane("2");
		buttonPaneMachine.add(ButtonPane("2"), BorderLayout.PAGE_START);
		buttonPaneMachine.add(optionPaneMachine, BorderLayout.SOUTH);

		panelMachine.add(titleAvailableMachine);
		panelMachine.add(buttonPaneMachine);
		panelMachine.add(titleSelectedMachine);

		JPanel deletePane = new JPanel();
		deletePane.setLayout(new BorderLayout());
		JButton deletePoste = new JButton("Supprimer ce poste");
		deletePoste.addActionListener(this);
		deletePane.add(deletePoste, BorderLayout.WEST);

		this.add(panelOperators);
		this.add(new JSeparator(JSeparator.HORIZONTAL));
		this.add(panelMachine);
		this.add(deletePane);
		pack();
	}


	/**
	 * Disposition des bouttons Ajouter, Retirer, Nouveau
	 * @param str
	 * Permet d'identifier si le boutton appartient au panel operateur ("1") ou machine ("2")
	 * @return
	 * Renvoie le {@link JPanel} complet contenant les boutons
	 */
	public JPanel ButtonPane(String str) {
		JButton ajouter = new JButton("Ajouter >>");
		JButton enlever = new JButton("<< Retirer");
		JButton nouveau = new JButton("Nouveau...");

		ajouter.setActionCommand("a"+str);
		enlever.setActionCommand("e"+str);
		nouveau.setActionCommand("n"+str);

		Dimension d = new Dimension(95, 26);

		ajouter.setMaximumSize(d);
		ajouter.setMinimumSize(d);
		enlever.setMaximumSize(d);
		enlever.setMinimumSize(d);
		nouveau.setMaximumSize(d);
		nouveau.setMinimumSize(d);

		ajouter.addActionListener(this);
		enlever.addActionListener(this);
		nouveau.addActionListener(this);

		JPanel pane = new JPanel();
		pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
		pane.add(ajouter);
		pane.add(enlever);
		pane.add(new JLabel(" "));
		pane.add(nouveau);
		return pane;
	}

	/**
	 * Disposition des bouttons Modifier, Supprimer
	 * @param str
	 * Permet d'identifier si le boutton appartient au panel operateur ("1") ou machine ("2")
	 * @return
	 * Renvoie le {@link JPanel} complet contenant les boutons
	 */
	public JPanel optionButtonPane (String str) {
		JButton modifier = new JButton("Modifier");
		JButton supprimer = new JButton("Supprimer");

		supprimer.setActionCommand("s"+str);
		modifier.setActionCommand("m"+str);

		Dimension d = new Dimension(95, 26);

		modifier.setMaximumSize(d);
		modifier.setMinimumSize(d);

		supprimer.addActionListener(this);
		modifier.addActionListener(this);

		JPanel pane = new JPanel();
		pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
		pane.add(modifier);
		pane.add(supprimer);
		pane.setVisible(false);
		return pane;
	}

	/**
	 * Creation d'un JPanel contenant les champs permetant a l'utilisateur de creer un nouvel operateur
	 * @param nom
	 * {@link JTextField} permetant la recuperation du nom de l'operateur
	 * @param qualif
	 * {@link JTextField} permetant la recuperation des qualifications de l'operateur
	 * @return
	 * {@link JPanel} contenant les 2 {@link JTextField} et les 2 labels de titre associes
	 */
	public JPanel createOperateur(JTextField nom, JTextField qualif) {
		JPanel pane = new JPanel();
		pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
		pane.add(new JLabel("Nom :"));
		pane.add(nom);
		pane.add(new JLabel("Qualifications :"));
		pane.add(qualif);
		return pane;
	}

	/**
	 * Creation d'un JPanel contenant les champs permetant a l'utilisateur de creer un nouvel operateur
	 * @param nom
	 * {@link JTextField} permetant la recuperation du nom de l'operateur
	 * @return
	 * {@link JPanel} contenant le {@link JTextField} et le label de titre associe
	 */
	public JPanel createMachine(JTextField nom) {
		JPanel pane = new JPanel();
		pane.setLayout(new BoxLayout(pane, BoxLayout.PAGE_AXIS));
		pane.add(new JLabel("Designation :"));
		pane.add(nom);
		return pane;
	}


	/**
	 * Listener associe a tout les bouttons de la fenetre
	 */
	public void actionPerformed(ActionEvent e) {
		//---------------------------------------------------Events lies aux operateurs
		//boutton ajouter operateur
		if (e.getActionCommand().equals("a1")) {
			Object[] obj = availableOperators.getSelectedValues();
			for (Object o : obj){
				if (modelSelectedOperators.indexOf((Operateur)o)==-1) {
					pc.getOperateur().add((Operateur)o);
					modelSelectedOperators.addElement(o);
				}
			}			
		}
		//boutton enlever operateur
		else if (e.getActionCommand().equals("e1")) {
			Object[] obj = selectedOperators.getSelectedValues();
			for (Object o : obj){
				pc.getOperateur().remove((Operateur)o);
				modelSelectedOperators.removeElement(o);
			}			
		}
		//boutton supprimer operateur
		else if (e.getActionCommand().equals("s1")) {
			Object[] obj = availableOperators.getSelectedValues();
			if (availableOperators.getSelectedIndex() == -1){JOptionPane.showMessageDialog(this, "Veuillez selectionner des operateurs a supprimer dans la liste\nd'operateurs disponibles","Erreur de selection", JOptionPane.INFORMATION_MESSAGE);}
			else {
				int choix = JOptionPane.showConfirmDialog(this, "Voulez vous vraiment supprimer de la base de donnee les operateurs selectionnes ?", "Confirmer suppression", JOptionPane.YES_NO_OPTION);
				if (choix == 0){
					for (Object o : obj) {
						GestionPoste.supprimerOperateur(((Operateur)o).getReference());
						boolean deleted;
						do {
							pc.removeOperateur((Operateur)o);
							deleted = modelSelectedOperators.removeElement(o);
							modelAvailableOperators.removeElement(o);
						}while (deleted==true);
					}
					availableOperators.updateUI();
					selectedOperators.updateUI();
				}
			}
		}
		//boutton modifier operateur
		else if (e.getActionCommand().equals("m1")) {
			Operateur o = (Operateur)(availableOperators.getSelectedValue());
			JTextField nom = new JTextField(o.getNom());
			JTextField qualif = new JTextField(o.getQualifications());

			int i = JOptionPane.showConfirmDialog(this, createOperateur(nom, qualif), "Modification de "+o, JOptionPane.OK_CANCEL_OPTION);
			if (i == JOptionPane.OK_OPTION) {
				//si un des textfield est vide, message d'erreur
				if (nom.getText().trim().length()==0 || qualif.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(this, "Veuillez remplir tout les champs", "Erreur",JOptionPane.ERROR_MESSAGE);
					actionPerformed(e);
				}
				else {
					o.setNom(nom.getText());
					o.setQualifications(qualif.getText());
					BaseDonnees.listeOperateurs.set(availableOperators.getSelectedIndex(), o);
					availableOperators.updateUI();
					selectedOperators.updateUI();
				}
			}
		}
		//boutton creer operateur
		else if (e.getActionCommand().equals("n1")) {
			JTextField nom = new JTextField();
			JTextField qualif = new JTextField();

			int i = JOptionPane.showConfirmDialog(this, createOperateur(nom, qualif), "Nouvel Operateur", JOptionPane.OK_CANCEL_OPTION);
			if (i == JOptionPane.OK_OPTION) {
				//si un des textfield est vide, message d'erreur
				if (nom.getText().trim().length()==0 || qualif.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(this, "Veuillez remplir tout les champs", "Erreur",JOptionPane.ERROR_MESSAGE);
					actionPerformed(e);
				}
				else {
					Operateur o = new Operateur(qualif.getText(), nom.getText());
					GestionPoste.creerOperateur(o);
					modelAvailableOperators.addElement(o);
					availableOperators.updateUI();
				}
			}
		}

		//---------------------------------------------------Events lies aux machines
		//boutton ajouter machine
		else if (e.getActionCommand().equals("a2")) {
			Object[] obj = availableMachine.getSelectedValues();
			for (Object o : obj){
				if (modelSelectedMachine.indexOf((Machine)o)==-1) {
					pc.getMachine().add((Machine)o);
					modelSelectedMachine.addElement(o);
				}
			}		
		}
		//boutton enlever machine
		else if (e.getActionCommand().equals("e2")) {
			Object[] obj = selectedMachine.getSelectedValues();
			for (Object o : obj){
				pc.getMachine().remove((Machine)o);
				modelSelectedMachine.removeElement(o);
			}
		}
		//boutton supprimer machine
		else if (e.getActionCommand().equals("s2")) {
			Object[] obj = availableMachine.getSelectedValues();
			if (availableMachine.getSelectedIndex() == -1){JOptionPane.showMessageDialog(this, "Veuillez selectionner des operateurs a supprimer dans la liste\nde machines disponibles","Erreur de selection", JOptionPane.INFORMATION_MESSAGE);}
			else {
				int choix = JOptionPane.showConfirmDialog(this, "Voulez vous vraiment supprimer de la base de donnee les machines selectionnees ?", "Confirmer suppression", JOptionPane.YES_NO_OPTION);
				if (choix == JOptionPane.OK_OPTION){
					for (Object o : obj) {
						GestionPoste.supprimerMachine(((Machine)o).getReference());
						boolean deleted;
						do {
							pc.removeMachine((Machine)o);
							deleted = modelSelectedMachine.removeElement(o);
							modelAvailableMachine.removeElement(o);
						}while (deleted==true);
					}
					availableOperators.updateUI();
					selectedOperators.updateUI();
				}
			}
		}
		//boutton modifier machine
		else if (e.getActionCommand().equals("m2")) {
			Machine m = (Machine)(availableMachine.getSelectedValue());
			JTextField nom = new JTextField(m.getNom());

			int i = JOptionPane.showConfirmDialog(this, createMachine(nom), "Modification de "+m, JOptionPane.OK_CANCEL_OPTION);
			if (i == JOptionPane.OK_OPTION) {
				//si le textfield est vide, message d'erreur
				if (nom.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(this, "Veuillez remplir tout les champs", "Erreur",JOptionPane.ERROR_MESSAGE);
					actionPerformed(e);
				}
				else {
					m.setNom(nom.getText());
					BaseDonnees.listeMachines.set(availableMachine.getSelectedIndex(), m);
					availableOperators.updateUI();
					selectedOperators.updateUI();
				}
			}
		}
		//boutton ajouter machine
		else if (e.getActionCommand().equals("n2")) {
			JTextField nom = new JTextField();

			int i = JOptionPane.showConfirmDialog(this, createMachine(nom), "Nouvelle Machine", JOptionPane.OK_CANCEL_OPTION);
			if (i == JOptionPane.OK_OPTION) {
				//si un des textfield est vide, message d'erreur
				if (nom.getText().trim().length()==0) {
					JOptionPane.showMessageDialog(this, "Veuillez remplir tout les champs", "Erreur",JOptionPane.ERROR_MESSAGE);
					actionPerformed(e);
				}
				else {
					Machine m = new Machine(nom.getText());
					GestionPoste.creerMachine(m);
					modelAvailableMachine.addElement(m);
					availableMachine.updateUI();
				}
			}
		}

		//---------------------------------------------------Events lies au poste de charge
		//supprimer poste
		else if (((JButton)(e.getSource())).getText().equals("Supprimer ce poste")) {
			int choix = JOptionPane.showConfirmDialog(this, "Voulez vous vraiment supprimer de la base de donnee le poste"+pc+" ?", "Confirmer suppression", JOptionPane.YES_NO_OPTION);
			if (choix == 0){
				GestionPoste.supprimerPoste(pc.getReference());
				this.dispose();
			}
		}
	}

	/**
	 * Listener associe aux 4 {@link JList}
	 */
	@Override
	public void valueChanged(ListSelectionEvent e) {
		String s = ((JList)e.getSource()).getName();
		if (s!=null && ((JList)e.getSource()).getSelectedIndex()!=-1) {
			if (s.equals("av1")) {
				selectedOperators.clearSelection();
				optionPaneOperateur.setVisible(true);
			}
			else if (s.equals("av2")) {
				selectedMachine.clearSelection();
				optionPaneMachine.setVisible(true);
			}
			else if (s.equals("se1")) {
				availableOperators.clearSelection();
				optionPaneOperateur.setVisible(false);
			}
			else if (s.equals("se2")) {
				availableMachine.clearSelection();
				optionPaneMachine.setVisible(false);
			}
		}
	}
}
