package interfaz;

import javax.swing.ImageIcon;
import javax.swing.JOptionPane;
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 java.awt.FlowLayout;
import javax.swing.JLabel;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import java.awt.Insets;

import javax.swing.BorderFactory;

import negocio.BloqueConstructivo;


import negocio.FaseBloque;
import negocio.FasePlantilla;
import negocio.Instancia;
import negocio.Proyecto;
import net.sf.jasperreports.engine.JRException;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.query.JRHibernateQueryExecuterFactory;
import net.sf.jasperreports.view.JasperViewer;

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

import persistencia.UtilidadHibernate;

import java.awt.Color;
import java.awt.SystemColor;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.swing.JScrollPane;

public class ModoGuiado 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 jLabel10 = null;

	private JPanel jPanel4 = null;

	private Principal padrePrincipal;
	
	//private Proyecto proyecto_seleccionado = null;  //  @jve:decl-index=0:
	
	private int nelementos = 0;
	
	private int elemento=0;

	private JButton jButton1 = null;
	
	private boolean flag_siguiente = false;
	
	int fase_actual=0;

	private JScrollPane jScrollPane = null;

	/**
	 * @param owner
	 */
	public ModoGuiado(Principal owner) {
		super(owner);
		padrePrincipal=owner;
		initialize();
	}
	
	private void MostrarBloques(int n){
		try{
			
			
			Session session=null;
			
			session = UtilidadHibernate.getSessionFactory().openSession();
			
			Transaction tx = session.beginTransaction();
			
			
			int idelemento = padrePrincipal.jList.getSelectedIndex();
			final Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(idelemento);

			fase_actual = nelementos - n + 1;
			
			List messages1 = session.createQuery("from FasePlantilla where orden='"+fase_actual+"' AND id_plantilla = '"+padrePrincipal.marco_seleccionado.getIdPlantilla()+"'").list();
			Iterator iter1 = messages1.iterator();
			FasePlantilla fase =(FasePlantilla) iter1.next();
			jLabel10.setText(fase.getNombre());
			
				JLabel etiqueta_bloque = new JLabel();
				etiqueta_bloque.setForeground(Color.DARK_GRAY);
				if (padrePrincipal.idioma.equals("español"))
					etiqueta_bloque.setText("Lista de Bloques:");
				else
					etiqueta_bloque.setText("List of blocks:");
				GridBagConstraints gridBagConstraints11 = new GridBagConstraints();
				gridBagConstraints11.gridx = 0;
				gridBagConstraints11.gridy = 0;
				gridBagConstraints11.insets = new Insets(5, 0, 0, 0);
				
				jPanel1.add(etiqueta_bloque,gridBagConstraints11);
				
				int nbloques = 0;
				List messages = session.createQuery("from BloqueConstructivo where id_plantilla = '"+padrePrincipal.marco_seleccionado.getIdPlantilla()+"'").list();
				for ( Iterator iter = messages.iterator(); iter.hasNext(); ) {
		
						final BloqueConstructivo bloque = (BloqueConstructivo) iter.next();
						
						List messages2 = session.createQuery("from FaseBloque where id_bloque ="+bloque.getIdBloque()+" AND id_fase_bloque = "+bloque.getFaseModoGuiado()+"").list();
						for (Iterator iter2 = messages2.iterator(); iter2.hasNext(); ){
							FaseBloque fasebloque = (FaseBloque) iter2.next();
							
							List messages3 = session.createQuery("from FasePlantilla where id_fase_plantilla ="+fasebloque.getFasePlantilla().getIdFasePlantilla()+"").list();
							Iterator iter3 = messages3.iterator();
							FasePlantilla faseplantilla = (FasePlantilla) iter3.next();
						
							if (bloque.getFaseModoGuiado()!=null && faseplantilla.getOrden() == fase_actual){
								JLabel etiqueta = new JLabel();
								etiqueta.setPreferredSize(new Dimension(200,25));
								
								etiqueta.setText(bloque.getNombre() + "        ");
								etiqueta.setToolTipText(bloque.getNombre());
								GridBagConstraints gridBagConstraints = new GridBagConstraints();
								gridBagConstraints.gridx = 1;
								gridBagConstraints.gridy = nbloques+1;
								gridBagConstraints.insets = new Insets(5, 0, 0, 0);
								
								jPanel1.add(etiqueta,gridBagConstraints);
								
								GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
								gridBagConstraints1.gridx = 2;
								gridBagConstraints1.gridy = nbloques+1;
								gridBagConstraints1.insets = new Insets(5, 0, 0, 0);
								
								JButton botonVer = new JButton();
								if(padrePrincipal.idioma.equals("español"))
									botonVer.setText("Ver instancias");
								else
									botonVer.setText("See instances");
								botonVer.addActionListener(
			
								        new ActionListener() {  // clase interna anónima
			
								            // manejar evento de botón
								            public void actionPerformed( ActionEvent evento )
								            {
								              VerInstancias ventana = new VerInstancias(bloque, padrePrincipal, proyecto);
								              ventana.setLocationRelativeTo(ModoGuiado.this);
								              ventana.setVisible(true);
								            }
			
								        } // fin de clase interna anónima
								      ); // fin de la llamada a addActionListener
								
								jPanel1.add(botonVer,gridBagConstraints1);
								
								GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
								gridBagConstraints2.gridx = 3;
								gridBagConstraints2.gridy = nbloques+1;
								gridBagConstraints2.insets = new Insets(5, 5, 0, 0);
								
								JButton botonInforme = new JButton();
								botonInforme.setIcon(new ImageIcon("./src/Imagenes/informe_instancias.png"));
								botonInforme.setPreferredSize(new Dimension(25,25));
								if (padrePrincipal.idioma.equals("español"))
									botonInforme.setToolTipText("Informe de instancias");
								else
									botonInforme.setToolTipText("Report of instances");
								
								botonInforme.addActionListener(
			
								        new ActionListener() {  // clase interna anónima
			
								            // manejar evento de botón
								            public void actionPerformed( ActionEvent evento )
								            {
								            	JasperPrint informe = null;
								            	Session sesion= UtilidadHibernate.getSessionFactory().openSession();
												
												HashMap parametros = new HashMap();
												parametros.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION,sesion);
												parametros.put("BL", bloque.getIdBloque());
												parametros.put("PR", proyecto.getIdProyecto());

												try {
													String fileName;
													if (padrePrincipal.idioma.equals("español"))
														fileName= "./src/informes/instancias.jasper";
													else
														fileName= "./src/informes/instances.jasper";
													informe= JasperFillManager.fillReport(fileName, parametros);
													
													JasperViewer.viewReport(informe,false);
													
													sesion.close();
												}
												catch (JRException e1){
													e1.printStackTrace();
												}
								            }
			
								        } // fin de clase interna anónima
								      ); // fin de la llamada a addActionListener
								
								jPanel1.add(botonInforme,gridBagConstraints2);
													
								nbloques=nbloques+1;
							}
					
				//}
							

						}
						
				}
				jPanel1.updateUI();
				//jList.setModel(modelo);
				tx.commit();
				session.close();
		}	
		catch (Exception exp) {
			// TODO: handle exception
			JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
		}
	}
	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		this.setSize(705, 415);
		this.setModal(false);
		if (padrePrincipal.idioma.equals("español"))
			this.setTitle("Modo Guiado");
		else
			this.setTitle("Guided mode");
		this.setContentPane(getJContentPane());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				
				try{
					Session session=null;
					
					session = UtilidadHibernate.getSessionFactory().openSession();
					
					int idelemento = padrePrincipal.jList.getSelectedIndex();
					Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(idelemento);
					
					List messages = session.createQuery("FROM FasePlantilla WHERE id_plantilla = '"+padrePrincipal.marco_seleccionado.getIdPlantilla()+"'").list();
		
						nelementos=messages.size();
						session.close();
						
						elemento=nelementos;
						jButton1.setEnabled(false);
						if (nelementos==1)
							jButton.setEnabled(false);
						MostrarBloques(elemento);

				}
				catch (Exception exp) {
					// TODO: handle exception
					JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
				}

			}
		});
	}

	/**
	 * 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.SOUTH);
			jContentPane.add(getJPanel4(), BorderLayout.NORTH);
			jContentPane.add(getJScrollPane(), 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.setBorder(BorderFactory.createMatteBorder(1, 1, 0, 0, Color.lightGray));
			jPanel.setBackground(SystemColor.controlHighlight);
			jPanel.setPreferredSize(new Dimension(100, 38));
			jPanel.add(getJButton(), null);
			jPanel.add(getJButton1(), null);
		}
		return jPanel;
	}

	/**
	 * This method initializes jPanel1	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel1() {
		if (jPanel1 == null) {
			jLabel10 = new JLabel();
			jLabel10.setText("");
			jLabel10.setForeground(Color.white);
			jPanel1 = new JPanel();
			jPanel1.setLayout(new GridBagLayout());
			jPanel1.setBorder(BorderFactory.createLineBorder(Color.lightGray, 0));
			jPanel1.setBackground(new Color(238, 238, 238));
		}
		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("Siguiente");
			else
				jButton.setText("Next");
			jButton.setPreferredSize(new Dimension(90, 26));
			jButton.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					Session session=null;
					
					session = UtilidadHibernate.getSessionFactory().openSession();
					
					int idelemento = padrePrincipal.jList.getSelectedIndex();
					Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(idelemento);
					
					List messages = session.createQuery("from FasePlantilla m where orden = '"+fase_actual+"' AND id_plantilla='"+padrePrincipal.marco_seleccionado.getIdPlantilla()+"'").list();
					Iterator iter = messages.iterator();
					FasePlantilla fase=(FasePlantilla) iter.next();
					
					session.close();
					
					jLabel10.setText(fase.getNombre());
					
					flag_siguiente=true;			
					jPanel1.removeAll();
					elemento--;
					if (elemento>1){
						
						MostrarBloques(elemento);
						jButton1.setEnabled(true);
						
					}
					else{
						
						MostrarBloques(elemento);
						jButton1.setEnabled(true);
						jButton.setEnabled(false);
					}
					
				}
			});
		}
		return jButton;
	}

	/**
	 * This method initializes jPanel4	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel4() {
		if (jPanel4 == null) {
			GridBagConstraints gridBagConstraints8 = new GridBagConstraints();
			gridBagConstraints8.anchor = GridBagConstraints.WEST;
			gridBagConstraints8.gridx = 0;
			gridBagConstraints8.gridy = 0;
			gridBagConstraints8.insets = new Insets(5, 0, 0, 0);
			jPanel4 = new JPanel();
			jPanel4.setLayout(new GridBagLayout());
			jPanel4.setPreferredSize(new Dimension(0, 30));
			jPanel4.setBorder(BorderFactory.createMatteBorder(0, 0, 1, 0, Color.lightGray));
			jPanel4.setBackground(new Color(102, 102, 102));
			jPanel4.add(jLabel10, gridBagConstraints8);
		}
		return jPanel4;
	}

	/**
	 * This method initializes jButton1	
	 * 	
	 * @return javax.swing.JButton	
	 */
	private JButton getJButton1() {
		if (jButton1 == null) {
			jButton1 = new JButton();
			if (padrePrincipal.idioma.equals("español"))
				jButton1.setText("Anterior");
			else
				jButton1.setText("Previous");
			jButton1.setPreferredSize(new Dimension(90, 26));
			jButton1.addActionListener(new java.awt.event.ActionListener() {
				public void actionPerformed(java.awt.event.ActionEvent e) {
					Session session=null;
					
					session = UtilidadHibernate.getSessionFactory().openSession();

					int idelemento = padrePrincipal.jList.getSelectedIndex();
					Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(idelemento);
					
					List messages = session.createQuery("from FasePlantilla m where orden = '"+fase_actual+"' AND id_plantilla='"+padrePrincipal.marco_seleccionado.getIdPlantilla()+"'").list();
					Iterator iter = messages.iterator();
					FasePlantilla fase=(FasePlantilla) iter.next();
					
					session.close();
					
					jLabel10.setText(fase.getNombre());
					
					flag_siguiente=false;
					jPanel1.removeAll();
					elemento++;
					if (elemento<nelementos){
						
						MostrarBloques(elemento);
						jButton.setEnabled(true);
						
					}
					else{
						
						MostrarBloques(elemento);
						jButton1.setEnabled(false);
						jButton.setEnabled(true);
					}
				}
			});
		}
		return jButton1;
	}

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

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