package interfaz;

import javax.swing.JPanel;
import java.awt.Frame;
import java.awt.BorderLayout;
import javax.swing.JDialog;
import java.awt.GridBagLayout;
import javax.swing.JButton;
import java.awt.GridBagConstraints;

import javax.swing.DefaultListModel;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JTextField;

import negocio.BloqueConstructivo;
import negocio.ComponenteBloque;
import negocio.Fase;
import negocio.Plantilla;
import negocio.Proyecto;
import negocio.Vista;
import interfaz.Principal;

import org.hibernate.Session;
import org.hibernate.Transaction;

import persistencia.UtilidadHibernate;

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

public class NuevoProyectoPlantilla 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;

	private JLabel jLabel1 = null;

	private JScrollPane jScrollPane = null;

	private JTextArea jTextArea = null;
	
	public Principal padrePrincipal = null;
	
	private boolean actualizar;

	//static public DefaultListModel modelo = new DefaultListModel();
	/**
	 * @param owner
	 */
	public NuevoProyectoPlantilla(Principal owner, boolean a) {
		super(owner);
		padrePrincipal = owner;
		actualizar=a;
		initialize();
	}
	
	public NuevoProyectoPlantilla(JDialog owner) {
		super(owner);
		initialize();
	}


	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(563, 267);
		this.setModal(true);	
		if (actualizar){
			if (padrePrincipal.idioma.equals("español"))
				if (padrePrincipal.usuario.getRol().equals("Implanter"))
					this.setTitle("Modificar proyecto");
				else
					this.setTitle("Modificar plantilla");
			else
				if (padrePrincipal.usuario.getRol().equals("Implanter"))
					this.setTitle("Modify project");
				else
					this.setTitle("Modify framework");
		}
		else{
			if (padrePrincipal.idioma.equals("español")){
				if (padrePrincipal.usuario.getRol().equals("Implanter"))
					this.setTitle("Nuevo proyecto");
				else
					this.setTitle("Nueva plantilla");
			}
				
			else
				if (padrePrincipal.usuario.getRol().equals("Implanter"))
					this.setTitle("New project");
				else
					this.setTitle("New framework");
		}
		
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {   
			public void windowOpened(java.awt.event.WindowEvent e) {
				if (actualizar){
					int elemento = padrePrincipal.jList.getSelectedIndex();	
					
					Session sesion = UtilidadHibernate.getSessionFactory().openSession();
					
					if (padrePrincipal.usuario!= null && padrePrincipal.usuario.getRol().equals("Developer")){
						Plantilla plantilla = (Plantilla) padrePrincipal.modelo.getElementAt(elemento);
						jTextField.setText(plantilla.getNombre());
						jTextArea.setText(plantilla.getDescripcion());
					}
					//LISTAS DE PROYECTOS
					else if (padrePrincipal.usuario != null && padrePrincipal.usuario.getRol().equals("Implanter")){	
						Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(elemento);
						jTextField.setText(proyecto.getNombre());
						jTextArea.setText(proyecto.getDescripcion());
					}
				}
			}
		});
	}

	/**
	 * 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	
	 */
	public JPanel getJPanel1() {
		if (jPanel1 == null) {
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.fill = GridBagConstraints.BOTH;
			gridBagConstraints3.gridy = 1;
			gridBagConstraints3.weightx = 1.0;
			gridBagConstraints3.weighty = 1.0;
			gridBagConstraints3.insets = new Insets(5, 5, 10, 20);
			gridBagConstraints3.gridx = 1;
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.gridx = 0;
			gridBagConstraints11.anchor = GridBagConstraints.NORTHWEST;
			gridBagConstraints11.insets = new Insets(5, 20, 0, 0);
			gridBagConstraints11.gridy = 1;
			jLabel1 = new JLabel();
			if (padrePrincipal.idioma.equals("español"))
				jLabel1.setText("Descripción:");
			else
				jLabel1.setText("Description:");
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 0;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.insets = new Insets(20, 5, 0, 20);
			gridBagConstraints1.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(20, 20, 0, 0);
			gridBagConstraints.anchor = GridBagConstraints.WEST;
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			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);
			jPanel1.add(jLabel1, gridBagConstraints11);
			jPanel1.add(getJScrollPane(), gridBagConstraints3);
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			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;
					String descripcion;
					
					if (!actualizar){
						try{
							
							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{			
								descripcion=jTextArea.getText();

								//Creamos la plantilla
								Plantilla plantilla=new Plantilla();
								plantilla.setNombre(nombre);
								plantilla.setDescripcion(descripcion);
								
								//Creamos el proyecto
								Proyecto proyecto=new Proyecto();
								proyecto.setNombre(nombre);
								proyecto.setDescripcion(descripcion);
								
								
								//En función del rol del usuario, almacenamos en la lista proyectos o plantillas.
								if (padrePrincipal.usuario.getRol().equals("Implantor")){

									padrePrincipal.modelo.addElement(proyecto);
								}
								else if (padrePrincipal.usuario.getRol().equals("Developer")){
									
									padrePrincipal.modelo.addElement(plantilla);
								}
								
								//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
								if (padrePrincipal.usuario.getRol().equals("Implanter")){
									proyecto.setPlantilla(padrePrincipal.marco_seleccionado);
									session.save(proyecto);
//									Convertimos los objetos en persistentes y los guardamos									
									tx.commit();
									
									//COPIAMOS LA ESTRUCTURA DE LA PLANTILLA (FASES, VISTAS, BLOQUES y COMPONENTES)
									session = UtilidadHibernate.getSessionFactory().openSession();

									padrePrincipal.ActualizaListaProyectosPlantillas(padrePrincipal.marco_seleccionado);
									
									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);
									NuevoProyectoPlantilla.this.dispose();
								}
								else if (padrePrincipal.usuario.getRol().equals("Developer")){
									session.save(plantilla);
//									Convertimos los objetos en persistentes y los guardamos									
									tx.commit();
									padrePrincipal.ActualizaListaProyectosPlantillas(null);
									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);
									NuevoProyectoPlantilla.this.dispose();
								}
								padrePrincipal.jList.setSelectedIndex(padrePrincipal.modelo.getSize()-1);
								
							}
						}	
						catch (Exception exp) {
							// TODO: handle exception
							JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
						}
					}
					else{
						try{
							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 elemento = padrePrincipal.jList.getSelectedIndex();	
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								Session session=null;
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								
//								En función del rol del usuario, almacenamos en la lista proyectos o plantillas.
								if (padrePrincipal.usuario.getRol().equals("Implanter")){

									Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(elemento);
									proyecto.setNombre(jTextField.getText());	
									proyecto.setDescripcion(jTextArea.getText());
									
									padrePrincipal.modelo.addElement(proyecto);
									session.update(proyecto);
									
									tx.commit();
									padrePrincipal.ActualizaListaProyectosPlantillas(proyecto.getPlantilla());
									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);
									NuevoProyectoPlantilla.this.dispose();
								}
								else if (padrePrincipal.usuario.getRol().equals("Developer")){
									
									Plantilla plantilla = (Plantilla) padrePrincipal.modelo.getElementAt(elemento);
									plantilla.setNombre(jTextField.getText());	
									plantilla.setDescripcion(jTextArea.getText());
									
									padrePrincipal.modelo.addElement(plantilla);
									
									session.update(plantilla);
									tx.commit();
									padrePrincipal.ActualizaListaProyectosPlantillas(null);
									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);
									NuevoProyectoPlantilla.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(getJTextArea());
		}
		return jScrollPane;
	}

	/**
	 * This method initializes jTextArea	
	 * 	
	 * @return javax.swing.JTextArea	
	 */
	private JTextArea getJTextArea() {
		if (jTextArea == null) {
			jTextArea = new JTextArea();
		}
		return jTextArea;
	}

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