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.Usuario;


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

import javax.swing.BorderFactory;
import javax.swing.JPasswordField;

public class NuevoUsuario 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 MantenimientoUsuarios padreMantenimientoUsuario = null;

	private JLabel jLabel1 = null;

	private JLabel jLabel2 = null;

	private JComboBox jComboBox = null;
	
	private boolean actualiza;

	private JPasswordField jPasswordField = null;

	/**
	 * @param owner
	 */
	public NuevoUsuario(MantenimientoUsuarios owner, boolean b) {
		super(owner);
		padreMantenimientoUsuario = owner;
		actualiza=b;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(382, 200);
		this.setModal(true);
		if (!actualiza){
			if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
				this.setTitle("Nuevo Usuario");
			else
				this.setTitle("New user");
		}
		else{
			if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
				this.setTitle("Modificar Usuario");
			else
				this.setTitle("Modify user");
		}
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				if (actualiza){
					jComboBox.setEnabled(false);
					int elemento=padreMantenimientoUsuario.jList.getSelectedIndex();
					Usuario user = (Usuario) padreMantenimientoUsuario.modelo.getElementAt(elemento);
					
					jTextField.setText(user.getLogin());
					jPasswordField.setText(user.getPassword());
					if (user.getRol().equals("Implanter"))
						jComboBox.setSelectedIndex(0);
					else if  (user.getRol().equals("Developer"))
						jComboBox.setSelectedIndex(1);
					else if  (user.getRol().equals("Administrator"))
						jComboBox.setSelectedIndex(2);
					jComboBox.setSelectedItem(user.getRol());
					if (user.getRol().equals("Administrador"))
						jComboBox.setEnabled(false);
				}
			}
		});
	}

	/**
	 * 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 gridBagConstraints12 = new GridBagConstraints();
			gridBagConstraints12.fill = GridBagConstraints.BOTH;
			gridBagConstraints12.gridy = 1;
			gridBagConstraints12.weightx = 1.0;
			gridBagConstraints12.anchor = GridBagConstraints.WEST;
			gridBagConstraints12.insets = new Insets(5, 5, 0, 15);
			gridBagConstraints12.gridx = 1;
			GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
			gridBagConstraints4.fill = GridBagConstraints.BOTH;
			gridBagConstraints4.gridy = 2;
			gridBagConstraints4.weightx = 1.0;
			gridBagConstraints4.insets = new Insets(5, 5, 0, 15);
			gridBagConstraints4.gridx = 1;
			GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
			gridBagConstraints3.gridx = 0;
			gridBagConstraints3.insets = new Insets(5, 0, 0, 0);
			gridBagConstraints3.anchor = GridBagConstraints.EAST;
			gridBagConstraints3.gridy = 2;
			jLabel2 = new JLabel();
			jLabel2.setText("Rol:");
			GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
			gridBagConstraints11.gridx = 0;
			gridBagConstraints11.insets = new Insets(5, 20, 0, 0);
			gridBagConstraints11.anchor = GridBagConstraints.EAST;
			gridBagConstraints11.gridy = 1;
			jLabel1 = new JLabel();
			jLabel1.setText("Password:");
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 0;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.anchor = GridBagConstraints.WEST;
			gridBagConstraints1.insets = new Insets(5, 5, 0, 15);
			gridBagConstraints1.gridx = 1;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.gridx = 0;
			gridBagConstraints.insets = new Insets(5, 20, 0, 0);
			gridBagConstraints.anchor = GridBagConstraints.EAST;
			gridBagConstraints.gridy = 0;
			jLabel = new JLabel();
			if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
				jLabel.setText("Login:");
			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(jLabel2, gridBagConstraints3);
			jPanel1.add(getJComboBox(), gridBagConstraints4);
			jPanel1.add(getJPasswordField(), gridBagConstraints12);
			
		}
		return jPanel1;
	}

	/**
	 * This method initializes jButton	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton() {
		if (jButton == null) {
			jButton = new JButton();
			if (padreMantenimientoUsuario.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;
					boolean flag_usuario_incorrecto=false;
					
					if (!actualiza){
						//NUEVO USUARIO
						try{
							if((nombre=jTextField.getText().trim()).length()<=0){
								if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
									throw new Exception("El nombre está vacío.");
								else
									throw new Exception("The name is empty.");
							}else if (jPasswordField.getText().trim().length()<=0){
								if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
									throw new Exception("La contraseña está vacía.");
								else
									throw new Exception("The password is empty.");
							}
							else{
								//Creamos el usuario
								Usuario usuario = new Usuario();
								usuario.setLogin(jTextField.getText());
								usuario.setPassword(jPasswordField.getText());
								if (jComboBox.getSelectedIndex()==0)
									usuario.setRol("Implanter");
								else if (jComboBox.getSelectedIndex()==1)
									usuario.setRol("Developer");
								else if (jComboBox.getSelectedIndex()==2)
									usuario.setRol("Administrator");
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								Session session=null;
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								
								//Comprobamos si ya existe ese nombre en la BD
								List messages = session.createQuery("from Usuario").list();
								//System.out.println("Número de elementos: " + messages.size());
								for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
									Usuario user = (Usuario) iter.next();
									if (user.getLogin().equals(usuario.getLogin())){
										flag_usuario_incorrecto=true;
										if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
											throw new Exception ("Error, el nombre de usuario ya existe.");
										else
											throw new Exception ("Error, the user name already exists.");
									}
								}
								
								//Convertimos los objetos en persistentes y los guardamos
								if (!flag_usuario_incorrecto)
									session.save(usuario);
																		
								tx.commit();
								padreMantenimientoUsuario.actualizaModelo();
								padreMantenimientoUsuario.EstadisticasNumeroUsuarios();
								padreMantenimientoUsuario.jList.setSelectedIndex(padreMantenimientoUsuario.modelo.getSize()-1);
								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);
								NuevoUsuario.this.dispose();
							}
						}	
						catch (Exception exp) {
							// TODO: handle exception
							JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
						}
					}
					else{
						//MODIFICAR USUARIO
						
						try{
							if((nombre=jTextField.getText().trim()).length()<=0){
								if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
									throw new Exception("El nombre está vacío.");
								else
									throw new Exception("The name is empty.");
							}else if (jPasswordField.getText().trim().length()<=0){
								if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
									throw new Exception("La contraseña está vacía.");
								else
									throw new Exception("The password is empty.");
							}else{
								int elemento=padreMantenimientoUsuario.jList.getSelectedIndex();
								Usuario usuario = (Usuario) padreMantenimientoUsuario.modelo.getElementAt(elemento);
								
								String nombre_usuario_antes = usuario.getLogin();
								usuario.setLogin(jTextField.getText());
								usuario.setPassword(jPasswordField.getText());
								if (jComboBox.getSelectedIndex()==0)
									usuario.setRol("Implanter");
								else if (jComboBox.getSelectedIndex()==1)
									usuario.setRol("Developer");
								
								//Creamos la sesión para almacenar el nombre del proyecto en la BD
								Session session=null;
								
								session = UtilidadHibernate.getSessionFactory().openSession();
									
//								Comprobamos si ya existe ese nombre en la BD
								List messages = session.createQuery("from Usuario").list();
								
								session.close();
								
								session = UtilidadHibernate.getSessionFactory().openSession();
								
								Transaction tx = session.beginTransaction();
								
								//System.out.println("Número de elementos: " + messages.size());
								for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
									Usuario user = (Usuario) iter.next();
									if (user.getLogin().equals(usuario.getLogin()) && !(nombre_usuario_antes.equals(usuario.getLogin())) ){
										flag_usuario_incorrecto=true;
										if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español"))
											throw new Exception ("Error, el nombre de usuario ya existe.");
										else
											throw new Exception ("Error, the user name already exists.");
									}
								}
								
								//Convertimos los objetos en persistentes y los guardamos
								
								if (!flag_usuario_incorrecto){
									session.update(usuario);
								}
																		
								tx.commit();
								padreMantenimientoUsuario.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);
								NuevoUsuario.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 jComboBox	
	 * 	
	 * @return javax.swing.JComboBox	
	 */
	private JComboBox getJComboBox() {
		if (jComboBox == null) {
			jComboBox = new JComboBox();
			if (padreMantenimientoUsuario.padrePrincipal.idioma.equals("español")){
				jComboBox.addItem("Implantador");
				jComboBox.addItem("Desarrollador");
				if (padreMantenimientoUsuario.padrePrincipal.usuario!=null && (padreMantenimientoUsuario.padrePrincipal.usuario.getRol().equals("Administrator")))
					jComboBox.addItem("Administrador");
			}
			else{
				jComboBox.addItem("Implanter");
				jComboBox.addItem("Developer");
				if (padreMantenimientoUsuario.padrePrincipal.usuario!=null && (padreMantenimientoUsuario.padrePrincipal.usuario.getRol().equals("Administrator")))
					jComboBox.addItem("Administrator");
			}
		}
		return jComboBox;
	}

	/**
	 * This method initializes jPasswordField	
	 * 	
	 * @return javax.swing.JPasswordField	
	 */
	private JPasswordField getJPasswordField() {
		if (jPasswordField == null) {
			jPasswordField = new JPasswordField();
		}
		return jPasswordField;
	}

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