package com.rjconsultores.ventaboletos.web.gui.controladores.expressos;

import java.io.ByteArrayOutputStream;
import java.io.FileInputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.apache.commons.io.IOUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Controller;
import org.zkoss.util.media.AMedia;
import org.zkoss.util.media.Media;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zhtml.Fileupload;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zk.ui.event.EventListener;
import org.zkoss.zul.Checkbox;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.dao.InformeVentasPuntoVentaDAO;
import com.rjconsultores.ventaboletos.dao.SolicitudExpresosDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.SolicitudExpreso;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.web.utilerias.MyDatebox;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.MyListbox;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.HibernateSearchObject;
import com.rjconsultores.ventaboletos.web.utilerias.paginacion.PagedListWrapper;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderDocumentosExpresos;
import com.rjconsultores.ventaboletos.web.utilerias.render.RenderExpresosPorCotizar;

import net.sf.jasperreports.engine.JRDataSource;
import net.sf.jasperreports.engine.JRExporterParameter;
import net.sf.jasperreports.engine.JRResultSetDataSource;
import net.sf.jasperreports.engine.JasperCompileManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.JasperReport;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import net.sf.jasperreports.engine.export.HtmlExporter;
import net.sf.jasperreports.engine.export.JRPdfExporter;
import net.sf.jasperreports.export.SimpleExporterInput;

@Controller("documentosExpresosController")
@Scope("prototype")
public class DocumentosExpresosController extends MyGenericForwardComposer{
	private static final long serialVersionUID = 1L;
	
	@Autowired
    private transient PagedListWrapper<SolicitudExpreso> plwTrayectosExpresos;
	
	@Autowired
	private EmpresaService empresaService;
	
	@Autowired
	private DataSource dataSource;
	
	@Autowired
	private SolicitudExpresosDAO solicitudExpresosDAO;
	
	private List<Empresa> lsEmpresa;
	private Combobox cmbEmpresa;
	private MyListbox expresosList;
	private Paging pagingExpresos;
	private Checkbox ckServiciosInactivos;
	
	private MyDatebox txtFechaInicio;
	private MyDatebox txtFechaFin;
	
	SolicitudExpreso expreso;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		lsEmpresa = empresaService.obtenerTodos();
		super.doAfterCompose(comp);
		
		expresosList.setItemRenderer(new RenderDocumentosExpresos(this, new EventListener() {			
			@Override
			public void onEvent(Event arg0) throws Exception {
				expreso = (SolicitudExpreso)arg0.getTarget().getAttribute("data");
				
		        byte[] response = null;
		        List<JasperPrint> jasperPrintList = new ArrayList<JasperPrint>();
		        
		        Connection conn = dataSource.getConnection();
				
				String sql = "select * from expreso_pasajero where solicitudexpreso_id = ?";
				
		        PreparedStatement stmt = conn.prepareStatement(sql);
		        stmt.setInt(1, expreso.getSolicitudExpresoId().intValue());
		        
		        ResultSet rset = stmt.executeQuery();
		        
		        JRDataSource jrDataSource = new JRResultSetDataSource(rset);
				
				HashMap<String, Object> parametros = new HashMap<String, Object>();
		        parametros.put("usuario", "FAAU");
		        
		        InputStream is = desktop.getWebApp().getResourceAsStream(
						"/gui/expressos/listaPasajerosExpreso.jrxml");
		        	JasperReport jr = JasperCompileManager.compileReport(is);
		        	JasperPrint jasperPrint = JasperFillManager.fillReport(jr, parametros, jrDataSource);
		            
		            jasperPrintList.add(jasperPrint);
		        
		        JRPdfExporter exporter = new JRPdfExporter();
				ByteArrayOutputStream out = new ByteArrayOutputStream();
				exporter.setParameter(JRExporterParameter.JASPER_PRINT_LIST, jasperPrintList);
				exporter.setParameter(JRExporterParameter.OUTPUT_STREAM, out);
				exporter.exportReport();
				response = out.toByteArray();
				
				AMedia amedia = new AMedia("LISTA DE PASAJEROS - EXPRESO " + expreso.getSolicitudExpresoId() + ".pdf", "pdf", null, response);
				org.zkoss.util.media.Media pdf = amedia;
				Filedownload.save(pdf);
			}
		}));
		
		refreshLista();
	}
	
	private void refreshLista() {
		HibernateSearchObject<SolicitudExpreso> buscarExpresos =
                new HibernateSearchObject<SolicitudExpreso>(SolicitudExpreso.class, pagingExpresos.getPageSize());
		
		Date fechaInicio = txtFechaInicio.getValue();
		if(fechaInicio != null) {
			buscarExpresos.addFilterGreaterOrEqual("fechaSolicitud", fechaInicio);
		}
		
		Date fechaFin = txtFechaFin.getValue();
		if(fechaFin != null) {
			buscarExpresos.addFilterLessOrEqual("fechaSolicitud", fechaFin);
		}
		
		if(ckServiciosInactivos.isChecked()) {
			buscarExpresos.addFilterLessOrEqual("ACTIVO", true);
		}
		
		plwTrayectosExpresos.init(buscarExpresos, expresosList, pagingExpresos);
	}
	
	public List<Empresa> getLsEmpresa() {
		return lsEmpresa;
	}

	public void setLsEmpresa(List<Empresa> lsEmpresa) {
		this.lsEmpresa = lsEmpresa;
	}

	public Combobox getCmbEmpresa() {
		return cmbEmpresa;
	}

	public void setCmbEmpresa(Combobox cmbEmpresa) {
		this.cmbEmpresa = cmbEmpresa;
	}

	public MyListbox getExpresosList() {
		return expresosList;
	}

	public void setExpresosList(MyListbox expresosList) {
		this.expresosList = expresosList;
	}

	public Paging getPagingExpresos() {
		return pagingExpresos;
	}

	public void setPagingExpresos(Paging pagingExpresos) {
		this.pagingExpresos = pagingExpresos;
	}

	public MyDatebox getTxtFechaInicio() {
		return txtFechaInicio;
	}

	public void setTxtFechaInicio(MyDatebox txtFechaInicio) {
		this.txtFechaInicio = txtFechaInicio;
	}

	public PagedListWrapper<SolicitudExpreso> getPlwTrayectosExpresos() {
		return plwTrayectosExpresos;
	}

	public void setPlwTrayectosExpresos(PagedListWrapper<SolicitudExpreso> plwTrayectosExpresos) {
		this.plwTrayectosExpresos = plwTrayectosExpresos;
	}
}
