package interfaz;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Frame;
import java.awt.BorderLayout;
import java.awt.GridBagConstraints;
import java.awt.Insets;

import javax.swing.JDialog;

import negocio.BloqueConstructivo;
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;

import javax.swing.JScrollPane;

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

import persistencia.UtilidadHibernate;

import java.awt.GridBagLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;



public class VerInstancias extends JDialog {

	private static final long serialVersionUID = 1L;

	private JPanel jContentPane = null;
	
	private BloqueConstructivo bloquePadre;

	private JScrollPane jScrollPane = null;

	private JPanel jPanel = null;
	
	private Principal padrePrincipal;
	
	private Proyecto padreProyecto;
	
	

	/**
	 * @param owner
	 */
	public VerInstancias(Frame owner) {
		super(owner);
		initialize();
	}
	
	public VerInstancias(BloqueConstructivo owner, Principal owner2, Proyecto pr) {
		//super(owner);
		bloquePadre=owner;
		padrePrincipal=owner2;
		padreProyecto = pr;
		initialize();
	}

	/**
	 * This method initializes this
	 * 
	 * @return void
	 */
	private void initialize() {
		Session session=null;
		
		session = UtilidadHibernate.getSessionFactory().openSession();
		
		//Transaction tx = session.beginTransaction();
	
		List messages3 = session.createQuery("from Instancia where id_bloque = '"+bloquePadre.getIdBloque()+"' AND id_proyecto ='"+padreProyecto.getIdProyecto()+"'").list();
		
		int tamaño=messages3.size();
		
		
		session.close();
		if (tamaño<=0){
			this.setSize(500, 75);
		}
		else if (tamaño<14)
			this.setSize(500, 50+50*tamaño);
		else
			this.setSize(500, 700);
		this.setContentPane(getJContentPane());
		this.setModal(true);
		if (padrePrincipal.idioma.equals("español"))
			this.setTitle("Instancias del bloque: " + bloquePadre.getNombre());
		else
			this.setTitle("Instances of the block: " + bloquePadre.getNombre());
		this.addWindowListener(new java.awt.event.WindowAdapter() {
			public void windowOpened(java.awt.event.WindowEvent e) {
				Session session=null;
				
				session = UtilidadHibernate.getSessionFactory().openSession();
				
				//Transaction tx = session.beginTransaction();
			
				List messages3 = session.createQuery("from Instancia where id_bloque = '"+bloquePadre.getIdBloque()+"' AND id_proyecto ='"+padreProyecto.getIdProyecto()+"'").list();
				
				int ninstancias=0;
				if(messages3.size()<=0){
					JLabel etiqueta2 = new JLabel();
					if (padrePrincipal.idioma.equals("español"))
						etiqueta2.setText("Este bloque no tiene instancias asociadas.");
					else
						etiqueta2.setText("This block doesn't have associated instances");
					GridBagConstraints gridBagConstraints22 = new GridBagConstraints();
					gridBagConstraints22.gridx = 0;
					gridBagConstraints22.gridy = 0;
					gridBagConstraints22.insets = new Insets(5, 0, 0, 0);
					
					jPanel.add(etiqueta2,gridBagConstraints22);
					jPanel.updateUI();
				}
				else{
					
				
					for (Iterator iter3 = messages3.iterator(); iter3.hasNext(); ){
						
						final Instancia instancia = (Instancia) iter3.next();
						
						final JLabel etiqueta2 = new JLabel();
						etiqueta2.setPreferredSize(new Dimension(150,25));
						etiqueta2.setText(instancia.getNombre());
						etiqueta2.setToolTipText(instancia.getNombre());
										
						GridBagConstraints gridBagConstraints2 = new GridBagConstraints();
						gridBagConstraints2.gridx = 0;
						gridBagConstraints2.gridy = ninstancias+1;
						gridBagConstraints2.insets = new Insets(5, 0, 0, 0);
						
						jPanel.add(etiqueta2,gridBagConstraints2);
						
						JButton boton = new JButton();
						boton.setPreferredSize(new Dimension(83,25));
						if (padrePrincipal.idioma.equals("español"))
							boton.setText("Rellenar");
						else
							boton.setText("Fill");
						boton.addActionListener(
	
						        new ActionListener() {  // clase interna anónima
	
						            // manejar evento de botón
						            public void actionPerformed( ActionEvent evento )
						            {
						            	//etiqueta2.setForeground(Color.red);
						              RellenarInstancia ventana = new RellenarInstancia(instancia,bloquePadre, etiqueta2, padrePrincipal);
						              ventana.setLocationRelativeTo(VerInstancias.this);
						              ventana.setVisible(true);
						            }
	
						        } // fin de clase interna anónima
						      ); // fin de la llamada a addActionListener
												
						GridBagConstraints gridBagConstraints3 = new GridBagConstraints();
						gridBagConstraints3.gridx = 1;
						gridBagConstraints3.gridy = ninstancias+1;
						gridBagConstraints3.insets = new Insets(5, 0, 0, 0);
						
						jPanel.add(boton,gridBagConstraints3);
						
						JButton boton2 = new JButton();
						boton2.setPreferredSize(new Dimension(83,25));
						if (padrePrincipal.idioma.equals("español"))
							boton2.setText("Ver");
						else
							boton2.setText("See");
						boton2.addActionListener(
	
						        new ActionListener() {  // clase interna anónima
	
						            // manejar evento de botón
						            public void actionPerformed( ActionEvent evento )
						            {
						            	//etiqueta2.setForeground(Color.orange);
						              VerInstancia ventana = new VerInstancia(instancia,bloquePadre, padrePrincipal);
						              ventana.setLocationRelativeTo(VerInstancias.this);
						              ventana.setVisible(true);
						            }
	
						        } // fin de clase interna anónima
						      ); // fin de la llamada a addActionListener
						
						GridBagConstraints gridBagConstraints4 = new GridBagConstraints();
						gridBagConstraints4.gridx = 2;
						gridBagConstraints4.gridy = ninstancias+1;
						gridBagConstraints4.insets = new Insets(5, 5, 0, 0);
						
						jPanel.add(boton2,gridBagConstraints4);
						
						JButton boton3 = new JButton();
						boton3.setPreferredSize(new Dimension(25,25));
						boton3.setIcon(new ImageIcon("./src/Imagenes/informe_contenido_instancia.png"));
						boton3.addActionListener(
	
						        new ActionListener() {  // clase interna anónima
	
						            // manejar evento de botón
						            public void actionPerformed( ActionEvent evento )
						            {
						            	try{
											JasperPrint informe = null;
											int numero_proyecto = padrePrincipal.jList.getSelectedIndex();
											//int numero_bloque =padrePrincipal.jList3.getSelectedIndex();

												Proyecto proyecto = (Proyecto) padrePrincipal.modelo.getElementAt(numero_proyecto);
												
												Session sesion= UtilidadHibernate.getSessionFactory().openSession();
												
												HashMap parametros = new HashMap();
												parametros.put(JRHibernateQueryExecuterFactory.PARAMETER_HIBERNATE_SESSION,sesion);
												parametros.put("I", instancia.getIdInstancia());
												parametros.put("PR", padreProyecto.getIdProyecto());
												parametros.put("BL", bloquePadre.getIdBloque());

							
												try {
													String fileName;
													if (padrePrincipal.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 (padrePrincipal.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().width,viewer.getToolkit().getScreenSize().height-40);    
													//viewer.setExtendedState(viewer.MAXIMIZED_BOTH);
													viewer.setLocationRelativeTo(VerInstancias.this);
													JRViewer jrv = new JRViewer(informe);
													viewer.getContentPane().add(jrv);
													viewer.setVisible(true);
													viewer.setModal(true);
													
													//Exportar a PDF
													//JasperExportManager.exportReportToPdfFile(informe, "reportEjemplo.pdf");
													
													
												}
												catch (JRException e1){
													e1.printStackTrace();
												}
										}
										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
						
												
						GridBagConstraints gridBagConstraints5 = new GridBagConstraints();
						gridBagConstraints5.gridx = 3;
						gridBagConstraints5.gridy = ninstancias+1;
						gridBagConstraints5.insets = new Insets(5, 5, 0, 0);
						
						jPanel.add(boton3,gridBagConstraints5);
						
						ninstancias++;
						jPanel.updateUI();
					}
				}
				session.close();
			}
		});
		
	}

	/**
	 * This method initializes jContentPane
	 * 
	 * @return javax.swing.JPanel
	 */
	private JPanel getJContentPane() {
		if (jContentPane == null) {
			jContentPane = new JPanel();
			jContentPane.setLayout(new BorderLayout());
			jContentPane.add(getJScrollPane(), BorderLayout.CENTER);
			
			
		}
		return jContentPane;
	}

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

	/**
	 * This method initializes jPanel	
	 * 	
	 * @return javax.swing.JPanel	
	 */
	private JPanel getJPanel() {
		if (jPanel == null) {
			jPanel = new JPanel();
			jPanel.setLayout(new GridBagLayout());
			jPanel.setBackground(new Color(238, 238, 238));
		}
		return jPanel;
	}

}
