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

import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;

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.resource.Labels;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Filedownload;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Paging;

import com.rjconsultores.ventaboletos.entidad.TrayectosExpresos;
import com.rjconsultores.ventaboletos.relatorios.impl.RelatorioInformeViajesOcasionalesPdf;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
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.RenderInformeViajesOcasionales;

@Controller("informeViajesOcasionalesExpresosController")
@Scope("prototype")
public class InformeViajesOcasionalesExpresosController extends MyGenericForwardComposer{
	
	private static final String NOME_RELATORIO = "informeViajesOcasionales";
	private static final long serialVersionUID = 1L;
	
	@Autowired
    private transient PagedListWrapper<TrayectosExpresos> plwTrayectosExpresos;
	
	private MyDatebox dtInicio;
	private MyDatebox dtFim;
	private MyListbox expresosList;
	private Paging pagingExpresos;
	
	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);
		
		expresosList.setItemRenderer(new RenderInformeViajesOcasionales());
		
		refreshLista();
	}
	
	private void refreshLista() throws InterruptedException {
		HibernateSearchObject<TrayectosExpresos> buscarExpresos =
                new HibernateSearchObject<TrayectosExpresos>(TrayectosExpresos.class, pagingExpresos.getPageSize());
		
		Date fechaInicio = dtInicio.getValue();
		if(fechaInicio != null) {
			buscarExpresos.addFilterGreaterOrEqual("solicitudExpresoId.fechaSolicitud", DateUtil.inicioFecha(fechaInicio));
		}else {
			Messagebox.show(
					Labels.getLabel("MSG.Error.dataObrigatoria"),
					Labels.getLabel("winInformeViajesOcasionalesExpresos.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}
		
		Date fechaFin = dtFim.getValue();
		if(fechaFin != null) {
			buscarExpresos.addFilterLessOrEqual("solicitudExpresoId.fechaSolicitud", DateUtil.fimFecha(fechaFin));
		}else {
			Messagebox.show(
					Labels.getLabel("MSG.Error.dataObrigatoria"),
					Labels.getLabel("winInformeViajesOcasionalesExpresos.title"),
					Messagebox.OK, Messagebox.ERROR);
			return;
		}
		
		plwTrayectosExpresos.init(buscarExpresos, expresosList, pagingExpresos);
	}
	
	public void onClick$btnPesquisa(Event ev) throws InterruptedException {
		refreshLista();
    }
	
	public void onClick$btnImprimir(Event ev) throws InterruptedException {}
	
	public void onClick$btnExportarPdf(Event ev) throws SQLException, Exception {
		excutarInformeViajes(true);
	}
	
	private void excutarInformeViajes(boolean isPdf)throws SQLException, Exception  {
		RelatorioInformeViajesOcasionalesPdf r = new RelatorioInformeViajesOcasionalesPdf(expresosList);
		InputStream mediais = new ByteArrayInputStream(r.generateReportRender(isPdf));
		SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd_HH-mm");
		String nomeRelatorioDownload = NOME_RELATORIO + "_" + sdf.format(Calendar.getInstance().getTime());

		if(isPdf) {
			AMedia conteudoRelatorioXLS = new AMedia("relatorio.pdf", "pdf", null, mediais);
			Filedownload.save(conteudoRelatorioXLS.getStreamData(), "application/pdf", nomeRelatorioDownload + ".pdf");
		}else {
			AMedia conteudoRelatorioXLS = new AMedia("relatorio.xls", "xls", null, mediais);
			Filedownload.save(conteudoRelatorioXLS.getStreamData(), "application/xls", nomeRelatorioDownload + ".xls");
		}
		
	}

	public MyListbox getExpresosList() {
		return expresosList;
	}

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

}
