package interfaz;

import javax.swing.JPanel;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import negocio.BloqueConstructivo;
import negocio.ComponenteBloque;
import negocio.ComponenteInstancia;
import negocio.Instancia;
import negocio.Plantilla;
import negocio.Proyecto;
import negocio.SeleccionComponenteListaBloque;

import org.hibernate.Session;
import org.hibernate.Transaction;
import com.sun.crypto.provider.DESedeCipher;

import persistencia.UtilidadHibernate;

import java.awt.FlowLayout;
import java.awt.Insets;
import java.awt.SystemColor;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.awt.Color;
import javax.swing.JScrollPane;
import javax.swing.JList;
import java.awt.Dimension;
import javax.swing.BorderFactory;

public class ModificarComponenteLista extends JDialog {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;

	private JPanel jPanel = null;

	private JPanel jPanel1 = null;

	private JButton jButton = null;

	private JLabel jLabel = null;

	private JTextField jTextField = null;
	
	public MantenimientoInstancia padreMantenimientoInstancia = null;

	private boolean desdePrincipal=false;
	
	private EditorDeBloques padreEditorDeBloques;
	
	private ComponenteBloque componente;

	private JScrollPane jScrollPane = null;

	private JList jList = null;

	private JLabel jLabel1 = null;

	private JLabel jLabel2 = null;

	private JTextField jTextField1 = null;
	
	private int[] vector_elementos_seleccionados;
	
	public String idioma;
	/**
	 * @param owner
	 */
	public ModificarComponenteLista(EditorDeBloques owner, ComponenteBloque c) {
		super(owner);
		padreEditorDeBloques = owner;
		componente = c;
		idioma=padreEditorDeBloques.idioma;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		//this.setSize(550, 600);
		if (padreEditorDeBloques.desdePrincipal)
			padreEditorDeBloques.padrePrincipal.Tamaño_ventana(this);
		else
			padreEditorDeBloques.padreMantenimientoBloque.padrePrincipal.Tamaño_ventana(this);
		this.setModal(true);
		if (idioma.equals("español"))
			this.setTitle("Modificar componente lista");
		else
			this.setTitle("Modify component");
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				jTextField.setText(componente.getNombre());
				jTextField1.setText(componente.getCardinalidadLista().toString());
				jList.setModel(padreEditorDeBloques.modelolista);
				padreEditorDeBloques.ActualizarListaBloques();
				
				Session session = UtilidadHibernate.getSessionFactory().openSession();
				
				ArrayList<Integer> vector_bloque= new ArrayList<Integer>();
				
				List messages = session.createQuery("from SeleccionComponenteListaBloque m where id_componente_bloque = '"+componente.getIdComponenteBloque()+"'").list();
				for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
					SeleccionComponenteListaBloque seleccioncomponente = (SeleccionComponenteListaBloque) iter.next();
					
					messages = session.createQuery("from BloqueConstructivo m where id_bloque = '"+seleccioncomponente.getBloqueConstructivo().getIdBloque()+"'").list();
					for ( Iterator iter2 = messages.iterator(); iter2.hasNext(); ) {
						BloqueConstructivo bloque = (BloqueConstructivo) iter2.next();
						vector_bloque.add(bloque.getIdBloque());
					}
				}

				
				int[] indices_bloques_seleccionados = new int[vector_bloque.size()];
				int n_bloques = padreEditorDeBloques.modelolista.size();
				int m = 0;
				for (int i = 0; i < n_bloques; i++) {
					BloqueConstructivo bloque;
					if (!padreEditorDeBloques.desdePrincipal)
						bloque = (BloqueConstructivo) padreEditorDeBloques.padreMantenimientoBloque.modelo.getElementAt(i);
					else
						bloque = (BloqueConstructivo) padreEditorDeBloques.padrePrincipal.modeloBloque.getElementAt(i);
					for (int j = 0; j < vector_bloque.size(); j++) {
						if (vector_bloque.get(j) == bloque.getIdBloque()) {
							indices_bloques_seleccionados[m] = i;
							m++;
						}
					}
				}
				for (int k = 0; k < indices_bloques_seleccionados.length; k++) {
					jList.setSelectedIndices(indices_bloques_seleccionados);
				}
				
				session.close();
			}
		});
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJPanel(), BorderLayout.EAST);
			jContentPane.add(getJPanel1(), BorderLayout.CENTER);
		}
		return jContentPane;
	}

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new FlowLayout());
			jPanel.setBackground(SystemColor.controlHighlight);
			jPanel.setBorder(BorderFactory.createMatteBorder(0, 1, 0, 0, Color.lightGray));
			jPanel.add(getJButton(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
			gridBagConstraints4.fill = GridBagConstraints.BOTH;
			gridBagConstraints4.gridy = 2;
			gridBagConstraints4.weightx = 1.0;
			gridBagConstraints4.insets = new Insets(5, 5, 10, 10);
			gridBagConstraints4.gridx = 1;
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.gridx = 0;
			gridBagConstraints3.anchor = GridBagConstraints.EAST;
			gridBagConstraints3.insets = new Insets(0, 0, 0, 5);
			gridBagConstraints3.gridy = 2;
			jLabel2 = new JLabel();
			if (idioma.equals("español"))
				jLabel2.setText("Cardinalidad:");
			else
				jLabel2.setText("Cardinality:");
			GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
			gridBagConstraints2.gridx = 0;
			gridBagConstraints2.insets = new Insets(5, 20, 0, 5);
			gridBagConstraints2.anchor = GridBagConstraints.NORTHWEST;
			gridBagConstraints2.gridy = 1;
			jLabel1 = new JLabel();
			if (idioma.equals("español"))
				jLabel1.setText("Se relaciona con:");
			else
				jLabel1.setText("Related with:");
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.fill = GridBagConstraints.BOTH;
			gridBagConstraints11.gridy = 1;
			gridBagConstraints11.weightx = 1.0;
			gridBagConstraints11.weighty = 1.0;
			gridBagConstraints11.insets = new Insets(5, 5, 0, 10);
			gridBagConstraints11.gridx = 1;
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 0;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.insets = new Insets(10, 5, 0, 10);
			gridBagConstraints1.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(10, 20, 0, 5);
			gridBagConstraints.anchor = GridBagConstraints.EAST;
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			if (idioma.equals("español"))
				jLabel.setText("Nombre:");
			else
				jLabel.setText("Name:");
			jPanel1 = new JPanel();
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.setBackground(new Color(238, 238, 238));
			jPanel1.add(jLabel, gridBagConstraints);
			jPanel1.add(getJTextField(), gridBagConstraints1);
			jPanel1.add(getJScrollPane(), gridBagConstraints11);
			jPanel1.add(jLabel1, gridBagConstraints2);
			jPanel1.add(jLabel2, gridBagConstraints3);
			jPanel1.add(getJTextField1(), gridBagConstraints4);
			
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			if (idioma.equals("español"))
				jButton.setText("Aceptar");
			else
				jButton.setText("Accept");
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					String nombre;
					
					try{
						if((nombre=jTextField.getText().trim()).length()<=0)
							if(idioma.equals("español"))
								throw new Exception("El nombre está vacío.");
							else
								throw new Exception("The name is empty.");
						else{

							Session session=null;
							
							session = UtilidadHibernate.getSessionFactory().openSession();
							
							//Comprobamos que el nombre del componente no se repita en la base de datos.
							List messages = session.createQuery("from ComponenteBloque where nombre ='"+nombre+"' AND id_bloque='"+padreEditorDeBloques.ObtenerBloque(padreEditorDeBloques.desdePrincipal).getIdBloque()+"'").list();
							if (messages.size() <= 0 || (messages.size()==1 && jTextField.getText().equals(componente.getNombre()))){
							
								//Cambiamos el componente del bloque seleccionado
								List messages2 = session.createQuery("from ComponenteBloque where nombre ='"+componente.getNombre()+"' AND tipo='"+componente.getTipo()+"' AND orden='"+componente.getOrden()+"' AND id_bloque='"+padreEditorDeBloques.ObtenerBloque(padreEditorDeBloques.desdePrincipal).getIdBloque()+"'").list();
								for (Iterator iter = messages2.iterator(); iter.hasNext(); ){
									ComponenteBloque comp = (ComponenteBloque) iter.next();
									
									//Borramos los bloque que estaban seleccionados para insertar posteriormente los nuevos seleccionados de la lista 'se relacion con'
									List messages3 = session.createQuery("from SeleccionComponenteListaBloque where id_componente_bloque ='"+comp.getIdComponenteBloque()+"'").list();
									for (Iterator iter2 = messages3.iterator(); iter2.hasNext(); ){
										Transaction tx = session.beginTransaction();
										SeleccionComponenteListaBloque seleccion = (SeleccionComponenteListaBloque) iter2.next();
										
										session.delete(seleccion);
										tx.commit();
									}
									
									ArrayList<BloqueConstructivo> vector_bloque= new ArrayList<BloqueConstructivo>();
									vector_elementos_seleccionados= jList.getSelectedIndices();
									
									
									for (int i=0; i<vector_elementos_seleccionados.length; i++){
										BloqueConstructivo bloque2 = (BloqueConstructivo) padreEditorDeBloques.modelolista.getElementAt(vector_elementos_seleccionados[i]);
										vector_bloque.add(bloque2);	
									}
									
									//Guardamos los nuevos 'Selección componente'
									for (int i=0; i<vector_bloque.size(); i++){
										SeleccionComponenteListaBloque seleccioncomponente = new SeleccionComponenteListaBloque();
										seleccioncomponente.setBloqueConstructivo(vector_bloque.get(i));
										seleccioncomponente.setComponenteBloque(componente);
										
										Transaction tx2 = session.beginTransaction();
										
										session.save(seleccioncomponente);
										
										tx2.commit();
									}

									Transaction tx = session.beginTransaction();
									
									comp.setNombre(nombre);
									comp.setCardinalidadLista(Integer.parseInt(jTextField1.getText()));
									session.update(comp);
									tx.commit();
								}
								
							}
							else{
								if (idioma.equals("español"))
									throw new Exception ("Error, ya existe un componente con ese nombre");
								else
									throw new Exception ("Error, There is already a component with that name");
							}
							session.close();
							
							
							//JOptionPane.showMessageDialog(null, "El proyecto se ha dado de alta correctamente, el responsable de proyecyo podrá modificarlos para añadirle los participantes y los participantes externos", "Información", JOptionPane.INFORMATION_MESSAGE);
							ModificarComponenteLista.this.dispose();
						}
					}	
					catch (Exception exp) {
						// TODO: handle exception
						JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
					}
				}
			});
		}
		return jButton;
	}

	/**
	 * This method initializes jTextField	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextField() {
		if (jTextField == null) {
			jTextField = new JTextField();
		}
		return jTextField;
	}

	/**
	 * This method initializes jScrollPane	
	 * 	
	 * @return javax.swing.JScrollPane	
	 */
	private JScrollPane getJScrollPane() {
		if (jScrollPane == null) {
			jScrollPane = new JScrollPane();
			jScrollPane.setViewportView(getJList());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jList	
	 * 	
	 * @return javax.swing.JList	
	 */
	private JList getJList() {
		if (jList == null) {
			jList = new JList();
		}
		return jList;
	}

	/**
	 * This method initializes jTextField1	
	 * 	
	 * @return javax.swing.JTextField	
	 */
	private JTextField getJTextField1() {
		if (jTextField1 == null) {
			jTextField1 = new JTextField();
		}
		return jTextField1;
	}

}  //  @jve:decl-index=0:visual-constraint="10,10"
