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 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.Iterator;
import java.util.List;
import java.awt.Color;
import javax.swing.BorderFactory;
import java.awt.Dimension;

public class NuevaInstancia 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 BloqueConstructivo padreBloque = null;
	
	private Principal padrePrincipal;
	
	private boolean actualizar;
	/**
	 * @param owner
	 */
	public NuevaInstancia(MantenimientoInstancia owner, BloqueConstructivo bl, boolean b, Principal p, boolean a) {
		super(owner);
		padreBloque = bl;
		padreMantenimientoInstancia = owner;
		desdePrincipal=b;
		padrePrincipal = p;
		actualizar=a;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(500, 250);
		this.setModal(true);
		if(!desdePrincipal){
			if (padreMantenimientoInstancia.padreMantenimientoBloque.padrePrincipal.idioma.equals("español"))
				this.setTitle("Nueva Instancia");
			else
				this.setTitle("New instance");
			this.setContentPane(getJContentPane());
		}
		else{
			if (!actualizar){
				if (padrePrincipal.idioma.equals("español"))
					this.setTitle("Nueva Instancia");
				else
					this.setTitle("New instance");
			}
			else{
				if (padrePrincipal.idioma.equals("español"))
					this.setTitle("Modificar instancia");
				else
					this.setTitle("Modify instance");
			}
			this.setContentPane(getJContentPane());
		}
		if (actualizar){
			int elemento = padreMantenimientoInstancia.jList.getSelectedIndex();	
			Instancia instancia = (Instancia) padreMantenimientoInstancia.modelo.getElementAt(elemento);
			jTextField.setText(instancia.getNombre());
		}
	}

	/**
	 * 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 gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 0;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.insets = new Insets(0, 5, 0, 20);
			gridBagConstraints1.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(0, 20, 0, 0);
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			if (!desdePrincipal){
				if (padreMantenimientoInstancia.padreMantenimientoBloque.padrePrincipal.idioma.equals("español"))
					jLabel.setText("Nombre:");
				else
					jLabel.setText("Name:");
			}
			else{
				if (padrePrincipal.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);
			
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			if (!desdePrincipal){
				if (padreMantenimientoInstancia.padreMantenimientoBloque.padrePrincipal.idioma.equals("español"))
					jButton.setText("Aceptar");
				else
					jButton.setText("Accept");
			}
			else{
				if (padrePrincipal.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{
						//NUEVA INSTANCIA
						if (!actualizar){
							if((nombre=jTextField.getText().trim()).length()<=0)
								if(padrePrincipal.idioma.equals("español"))
									throw new Exception("El nombre está vacío.");
								else
									throw new Exception("The name is empty.");
							else{

								int idelemento = padrePrincipal.jList.getSelectedIndex();
								Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(idelemento);
								
								//Creamos la instancia
								Instancia instancia = new Instancia();
								instancia.setNombre(nombre);
								instancia.setBloqueConstructivo(padreBloque);
								instancia.setProyecto(proyecto);
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								Session session=null;
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();

								//Convertimos los objetos en persistentes y los guardamos
								session.save(instancia);
								tx.commit();
								
								List messages = session.createQuery("from ComponenteBloque where id_bloque = '"+padreBloque.getIdBloque()+"'").list();
								for (Iterator iter = messages.iterator(); iter.hasNext();){
									ComponenteBloque componente_bloque = (ComponenteBloque) iter.next();
									
									ComponenteInstancia componente_instancia = new ComponenteInstancia();
									componente_instancia.setInstancia(instancia);
									componente_instancia.setComponenteBloque(componente_bloque);
									
									tx = session.beginTransaction();
									session.save(componente_instancia);
									tx.commit();
								}

								padreMantenimientoInstancia.actualizaModelo();
								padreMantenimientoInstancia.jList.setSelectedIndex(padreMantenimientoInstancia.modelo.getSize()-1);
								
								session.close();
								padreMantenimientoInstancia.EstadisticasNumeroInstancias();
								
								//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);
								NuevaInstancia.this.dispose();
							}
						
						}
						//MODIFICAR/ACTUALIZAR INSTANCIA
						else{
							if((nombre=jTextField.getText().trim()).length()<=0)
								if (!desdePrincipal){
									if(padreMantenimientoInstancia.padreMantenimientoBloque.padrePrincipal.idioma.equals("español"))
										throw new Exception("El nombre está vacío.");
									else
										throw new Exception("The name is empty.");
								}
								else{
									if(padrePrincipal.idioma.equals("español"))
										throw new Exception("El nombre está vacío.");
									else
										throw new Exception("The name is empty.");
								}
							else{
	
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								Session session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								
								int elemento = padreMantenimientoInstancia.jList.getSelectedIndex();	
								Instancia instancia = (Instancia) padreMantenimientoInstancia.modelo.getElementAt(elemento);
								instancia.setNombre(nombre);
								
								//Convertimos los objetos en persistentes y los guardamos
								session.update(instancia);
								
								tx.commit();
								padreMantenimientoInstancia.actualizaModelo();

								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);
								NuevaInstancia.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;
	}

}
