package interfaz;

//PINTAR COMPONENTE LISTA
//SE UTILIZA EN LA VENTANA VER INSTANCIA
// Cómo copiar elementos de una lista a otra.
import java.awt.*;
import java.awt.event.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

import javax.swing.*;

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

import persistencia.UtilidadHibernate;

import negocio.BloqueConstructivo;
import negocio.ComponenteBloque;
import negocio.ComponenteInstancia;
import negocio.ContenidoLista;
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.JRViewer;

public class ComponenteLista_VerInstancia extends JFrame
{
  private JList listaBloques;
  private JButton botonCopiar, botonEliminar, botonVer, botonInforme;
  private JLabel etiqueta_cardinalidad;
  private DefaultListModel modelo = new DefaultListModel();

  public ComponenteLista_VerInstancia(Container c, final ComponenteInstancia co, final BloqueConstructivo p,final JList lista, final DefaultListModel m, int tamaño_lista, final Principal princ, boolean es_mantenimiento_bloque)
  {
      super( "Listas de selección múltiple" );
      
      Session session=null;
		
		session = UtilidadHibernate.getSessionFactory().openSession();

	  //Creamos el panel donde almacenaremos todo (las dos listas y los botones de añadir y eliminar).
      Container contenedor = getContentPane();
      contenedor.setLayout( new FlowLayout() );

//    Me creo otro contenedor para meter el contenido de los dos botones de añadir y quitar
      JPanel contenedor2 = new JPanel();
      contenedor2.setLayout( new FlowLayout() );
      contenedor2.setPreferredSize(new Dimension(80, 80));

      List messages_contenido = session.createQuery("from ContenidoLista where id_componente_instancia = '"+co.getIdComponenteInstancia()+"'").list();
      for ( Iterator iter_contenido = messages_contenido.iterator(); iter_contenido.hasNext(); ) {
    	  ContenidoLista contenido_lista = (ContenidoLista) iter_contenido.next();
    	
    	  List messages_instancia = session.createQuery("from Instancia where id_instancia = '"+contenido_lista.getInstancia().getIdInstancia()+"'").list();
    	  for ( Iterator iter_instancia = messages_instancia.iterator(); iter_instancia.hasNext(); ) {
        	  Instancia instancia = (Instancia) iter_instancia.next();
        	  
        	  m.addElement(instancia);
    	  }
      }
      
      lista.setModel(m);
      
      //Creamos el botón ver y le asignamos el evento de vista de bloque de la lista de copia.
      if (princ.idioma.equals("español"))
    	  botonVer = new JButton( "Ver" );
      else
    	  botonVer = new JButton( "See" );
      botonVer.setPreferredSize(new Dimension(80,26));
      if (es_mantenimiento_bloque)
    	  botonVer.setEnabled(false);
      botonVer.addActionListener(

        new ActionListener() {  // clase interna anónima

            // manejar evento de botón
            public void actionPerformed( ActionEvent evento )
            {
              // colocar valores seleccionados en listaCopia
            	int elemento = lista.getSelectedIndex();
            	if (elemento != -1){
            		Instancia instancia = (Instancia) m.getElementAt(elemento);
            		VerInstancia ventana = new VerInstancia(instancia, p, princ);
            		//ventana.setLocationRelativeTo(CopiarListaAOtraInstancia.this);
            		ventana.setVisible(true);
            		ventana.setModal(false);
            	}
            }

        } // fin de clase interna anónima
      ); // fin de la llamada a addActionListener
      
      botonInforme = new JButton( "" );
      botonInforme.setIcon(new ImageIcon("./src/Imagenes/informe_instancias.png"));
      botonInforme.setPreferredSize(new Dimension(80,26));
      if (es_mantenimiento_bloque)
    	  botonInforme.setEnabled(false);
      botonInforme.addActionListener(

        new ActionListener() {  // clase interna anónima

            // manejar evento de botón
            public void actionPerformed( ActionEvent evento )
            {
            	try{
					JasperPrint informe = null;
					int numero_proyecto = princ.jList.getSelectedIndex();
					
						Proyecto proyecto = (Proyecto) princ.modelo.getElementAt(numero_proyecto);

						int numero_instancia = lista.getSelectedIndex();
						if (numero_instancia >= 0){
							Instancia i = (Instancia) m.getElementAt(numero_instancia);
							Session sesion= UtilidadHibernate.getSessionFactory().openSession();
							
							HashMap parametros = new HashMap();
							parametros.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION,sesion);
							parametros.put("I", i.getIdInstancia());
							parametros.put("PR", proyecto.getIdProyecto());
							parametros.put("BL", i.getBloqueConstructivo().getIdBloque());
							System.out.println("ID_BLOQUE = " + p.getIdBloque());

		
							try {
								String fileName;
								if (princ.idioma.equals("español"))
									fileName= "src/informes/componentes_bloque.jasper";
								else
									fileName= "src/informes/components_block.jasper";
								informe= JasperFillManager.fillReport(fileName, parametros);
								
								//JasperViewer.viewReport(informe,false);
								
								//Esto sustituye a JasperViewer.viewReport y sirve para mostrar el informe en primer plano
								JDialog viewer;
								if (princ.idioma.equals("español"))
									viewer = new JDialog(new JFrame(),"Vista previa del reporte", true);
								else
									viewer = new JDialog(new JFrame(),"Preview of report", true);
								viewer.setSize(800,600);
								viewer.setSize(viewer.getToolkit().getScreenSize());   
								JRViewer jrv = new JRViewer(informe);
								viewer.getContentPane().add(jrv);
								viewer.setVisible(true);
								viewer.setModal(false);

							}
							catch (JRException e1){
								e1.printStackTrace();
							}
						}
						else{
							if (princ.idioma.equals("español"))
								throw new Exception("Error, selecciona una instancia de la lista.");
							else
								throw new Exception("Error, select a instance of the list.");
						}
				}
				catch (Exception exp) {
					// TODO: handle exception
					JOptionPane.showMessageDialog(null, exp.getMessage(), "Error", JOptionPane.ERROR_MESSAGE);
				}
            }

        } // fin de clase interna anónima
      ); // fin de la llamada a addActionListener
      
      etiqueta_cardinalidad = new JLabel();
      etiqueta_cardinalidad.setVisible(true);
      
        //Asignamos la lista al contenedor principal
      	contenedor.add( new JScrollPane( lista ) );
      	
      	
      	//Asignamos los botones de manejo de la lista de copia al panel secundario.
      	contenedor2.add(botonVer);
      	contenedor2.add(botonInforme);
      	//contenedor2.add( botonEliminar );
      	contenedor2.add(etiqueta_cardinalidad);
      	contenedor2.setBackground(new Color(238, 238, 238));
      	
      	//Asignamos el panel secundario al contenedor principal.
      	contenedor.add(contenedor2);
      	contenedor.setBackground(new Color(238, 238, 238));
      	
      	//Asignamos el contenedor creado al contenedor principal
      	//contenedor.add(contenedor2);
      	
      GridBagConstraints gridBagConstraints = new GridBagConstraints();
		gridBagConstraints.gridx = 1;
		gridBagConstraints.insets = new Insets(5, 10, 0, 5);
		gridBagConstraints.anchor = GridBagConstraints.WEST;
		c.add( contenedor, gridBagConstraints);
		

      setSize( 325, 130 );

  } // fin del constructor PruebaSeleccionMultiple
} // fin de la clase PruebaSeleccionMultiple