// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/EmissorRelatorio.java
// public interface EmissorRelatorio {
// 
// 	void setConnection(Connection connection);
// 
// 	void emitir() throws IOException, JRException;
// 
// 	boolean isRelatorioGerado();
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/ExecutorRelatorio.java
// public interface ExecutorRelatorio {
// 
// 	void emite();
// 
// 	void setEmissor(EmissorRelatorio emissor);
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/Relatorio.java
// public interface Relatorio {
// 
// 	Map<String, Object> getParametros();
// 
// 	RelatorioFile getArquivo();
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/impl/EmissorRelatorioServlet.java
// public final class EmissorRelatorioServlet implements EmissorRelatorio {
// 	private Relatorio relatorio;
// 	private Connection connection;
// 	private HttpServletResponse servletResponse;
// 	private boolean relatorioGerado = false;
// 
// 	public EmissorRelatorioServlet(Relatorio relatorio, HttpServletResponse servletResponse) {
// 		this.relatorio = relatorio;
// 		this.servletResponse = servletResponse;
// 	}
// 
// 	public EmissorRelatorioServlet(Relatorio relatorio, HttpServletResponse output, Connection connection) {
// 		this(relatorio, output);
// 		this.connection = connection;
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#setConnection(java.sql.Connection)
// 	 */
// 	@Override
// 	public void setConnection(Connection connection) {
// 		this.connection = connection;
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#emitir()
// 	 */
// 	@Override
// 	public void emitir() throws JRException {
// 		try (InputStream relatorioArquivoStream = this.getClass().getResourceAsStream(relatorio.getArquivo().getCaminho())) {
// 			JasperPrint print = JasperFillManager.fillReport(relatorioArquivoStream, relatorio.getParametros(), connection);
// 			this.relatorioGerado = print.getPages().size() > 0;
// 			
// 			if(this.isRelatorioGerado()) {
// 				String attachment = String.format("attachment; filename=\"%s.pdf\"", relatorio.getArquivo().getNome());
// 				servletResponse.setHeader("Content-Disposition", attachment);
// 				JasperExportManager.exportReportToPdfStream(print, servletResponse.getOutputStream());		
// 			}
// 		} catch (IOException e) {
// 			throw new RelatorioNaoExisteException(relatorio, e);
// 		}
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#isRelatorioGerado()
// 	 */
// 	@Override
// 	public boolean isRelatorioGerado() {
// 		return this.relatorioGerado;
// 	}
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/impl/RelatorioPedidosEmitidos.java
// public final class RelatorioPedidosEmitidos extends RelatorioPedidos {
// 	public RelatorioPedidosEmitidos(Date dataInicio, Date dataFim) {
// 		super(dataInicio, dataFim, RelatorioUtils.localizaRelatorio("relatorio_pedidos_emitidos"));
// 	}
// }


import java.io.IOException;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import com.github.marcelothebuilder.webpedidos.util.report.EmissorRelatorio;
import com.github.marcelothebuilder.webpedidos.util.report.ExecutorRelatorio;
import com.github.marcelothebuilder.webpedidos.util.report.Relatorio;
import com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorioServlet;
import com.github.marcelothebuilder.webpedidos.util.report.impl.RelatorioPedidosEmitidos;
		return cal.getTime();
	}

	/**
	 * Valida as informações informadas pelo usuário, e caso estejam corretas,
	 * emite a stream do relatório gerado para o client, caso contrário,
	 * fornecem uma mensagem de erro.
	 * 
	 * @throws IOException
	 */
	public void emitir() {

		if (this.getDataInicio().after(getDataFim())) {
			String message = "A data de início deve ser maior que a data fim.";
			FacesMessage fMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, message, message);
			fContext.addMessage(null, fMessage);
			return;
		}

		int diasBetween = getIntervaloDias(this.getDataInicio(), this.getDataFim());

		if (diasBetween > 180) {
			String message = "Não é possível emitir um relatório para mais que 180 dias.";
			FacesMessage fMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, message, message);
			fContext.addMessage(null, fMessage);
			return;
		}

		Relatorio relatorioPedidos = new RelatorioPedidosEmitidos(getDataInicio(), getDataFim());

// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/EmissorRelatorio.java
// public interface EmissorRelatorio {
// 
// 	void setConnection(Connection connection);
// 
// 	void emitir() throws IOException, JRException;
// 
// 	boolean isRelatorioGerado();
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/ExecutorRelatorio.java
// public interface ExecutorRelatorio {
// 
// 	void emite();
// 
// 	void setEmissor(EmissorRelatorio emissor);
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/Relatorio.java
// public interface Relatorio {
// 
// 	Map<String, Object> getParametros();
// 
// 	RelatorioFile getArquivo();
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/impl/EmissorRelatorioServlet.java
// public final class EmissorRelatorioServlet implements EmissorRelatorio {
// 	private Relatorio relatorio;
// 	private Connection connection;
// 	private HttpServletResponse servletResponse;
// 	private boolean relatorioGerado = false;
// 
// 	public EmissorRelatorioServlet(Relatorio relatorio, HttpServletResponse servletResponse) {
// 		this.relatorio = relatorio;
// 		this.servletResponse = servletResponse;
// 	}
// 
// 	public EmissorRelatorioServlet(Relatorio relatorio, HttpServletResponse output, Connection connection) {
// 		this(relatorio, output);
// 		this.connection = connection;
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#setConnection(java.sql.Connection)
// 	 */
// 	@Override
// 	public void setConnection(Connection connection) {
// 		this.connection = connection;
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#emitir()
// 	 */
// 	@Override
// 	public void emitir() throws JRException {
// 		try (InputStream relatorioArquivoStream = this.getClass().getResourceAsStream(relatorio.getArquivo().getCaminho())) {
// 			JasperPrint print = JasperFillManager.fillReport(relatorioArquivoStream, relatorio.getParametros(), connection);
// 			this.relatorioGerado = print.getPages().size() > 0;
// 			
// 			if(this.isRelatorioGerado()) {
// 				String attachment = String.format("attachment; filename=\"%s.pdf\"", relatorio.getArquivo().getNome());
// 				servletResponse.setHeader("Content-Disposition", attachment);
// 				JasperExportManager.exportReportToPdfStream(print, servletResponse.getOutputStream());		
// 			}
// 		} catch (IOException e) {
// 			throw new RelatorioNaoExisteException(relatorio, e);
// 		}
// 	}
// 
// 	/* (non-Javadoc)
// 	 * @see com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorio#isRelatorioGerado()
// 	 */
// 	@Override
// 	public boolean isRelatorioGerado() {
// 		return this.relatorioGerado;
// 	}
// 
// }
// 
// Path: src/main/java/com/github/marcelothebuilder/webpedidos/util/report/impl/RelatorioPedidosEmitidos.java
// public final class RelatorioPedidosEmitidos extends RelatorioPedidos {
// 	public RelatorioPedidosEmitidos(Date dataInicio, Date dataFim) {
// 		super(dataInicio, dataFim, RelatorioUtils.localizaRelatorio("relatorio_pedidos_emitidos"));
// 	}
// }


// Path: src/main/java/com/github/marcelothebuilder/webpedidos/controller/RelatorioPedidosEmitidosBean.java
import java.io.IOException;
import java.io.Serializable;
import java.util.Calendar;
import java.util.Date;
import javax.enterprise.context.RequestScoped;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.inject.Inject;
import javax.inject.Named;
import javax.servlet.http.HttpServletResponse;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Past;
import org.joda.time.Days;
import org.joda.time.LocalDate;
import com.github.marcelothebuilder.webpedidos.util.report.EmissorRelatorio;
import com.github.marcelothebuilder.webpedidos.util.report.ExecutorRelatorio;
import com.github.marcelothebuilder.webpedidos.util.report.Relatorio;
import com.github.marcelothebuilder.webpedidos.util.report.impl.EmissorRelatorioServlet;
import com.github.marcelothebuilder.webpedidos.util.report.impl.RelatorioPedidosEmitidos;

		return cal.getTime();
	}

	/**
	 * Valida as informações informadas pelo usuário, e caso estejam corretas,
	 * emite a stream do relatório gerado para o client, caso contrário,
	 * fornecem uma mensagem de erro.
	 * 
	 * @throws IOException
	 */
	public void emitir() {

		if (this.getDataInicio().after(getDataFim())) {
			String message = "A data de início deve ser maior que a data fim.";
			FacesMessage fMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, message, message);
			fContext.addMessage(null, fMessage);
			return;
		}

		int diasBetween = getIntervaloDias(this.getDataInicio(), this.getDataFim());

		if (diasBetween > 180) {
			String message = "Não é possível emitir um relatório para mais que 180 dias.";
			FacesMessage fMessage = new FacesMessage(FacesMessage.SEVERITY_WARN, message, message);
			fContext.addMessage(null, fMessage);
			return;
		}

		Relatorio relatorioPedidos = new RelatorioPedidosEmitidos(getDataInicio(), getDataFim());

		EmissorRelatorio emissor = new EmissorRelatorioServlet(relatorioPedidos, response);