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

import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import java.util.TreeMap;

import javax.sql.DataSource;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.CellReference;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Scope;
import org.springframework.jdbc.datasource.DataSourceUtils;
import org.springframework.stereotype.Controller;
import org.zkoss.util.resource.Labels;
import org.zkoss.zhtml.Filedownload;
import org.zkoss.zhtml.Messagebox;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.event.Event;
import org.zkoss.zul.Combobox;
import org.zkoss.zul.Datebox;
import org.zkoss.zul.ListModelList;
import org.zkoss.zul.Timebox;

import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.OrgaoConcedente;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.Ruta;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioEmbarqueLocalidadeBean;
import com.rjconsultores.ventaboletos.service.EmpresaService;
import com.rjconsultores.ventaboletos.service.OrgaoConcedenteService;
import com.rjconsultores.ventaboletos.service.ParadaService;
import com.rjconsultores.ventaboletos.service.RutaService;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.UsuarioLogado;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxEstandar;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxParada;
import com.rjconsultores.ventaboletos.web.utilerias.MyComboboxRuta;
import com.rjconsultores.ventaboletos.web.utilerias.MyGenericForwardComposer;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

@Controller("relatorioEmbarqueLocalidadeController")
@Scope("prototype")

public class RelatorioEmbarqueLocalidadeController extends MyGenericForwardComposer {
	private static final long serialVersionUID = 1L;

	private static Logger log = LogManager.getLogger(RelatorioEmbarqueLocalidadeController.class);

	@Autowired
	private DataSource dataSourceRead;
	@Autowired
	private EmpresaService empresaService;
	@Autowired
	private RutaService rutaService;
	@Autowired
	private ParadaService paradaService;
	@Autowired
	private OrgaoConcedenteService orgaoConcedenteService;

	private Datebox datInicial;
	private Datebox datFinal;
	private Timebox horInicial;
	private Timebox horFinal;
	private Combobox cmbEmpresa;
	private Combobox cmbOrgaoConcedente;
	private MyComboboxRuta cmbRuta;
	private MyComboboxParada cmbOrigem;

	private List<Empresa> lsEmpresas;
	private List<OrgaoConcedente> lsOrgaosConcedentes;
	private List<Ruta> lsRutas;
	private List<Parada> lsOrigens;

	protected static final String FIELD_FEC_FINAL = "fecFinal";
	protected static final String FILED_FEC_INICIO = "fecInicio";
	protected static final String FIELD_HOR_INICIO = "horInicio";
	protected static final String FIELD_HOR_FINAL = "horFinal";
	protected static final String FIELD_EMPRESA_ID = "empresa";
	protected static final String FIELD_RUTA_ID = "ruta";
	protected static final String FIELD_ORGAO_CONCEDENTE_ID = "orgao";
	protected static final String FIELD_ORIGEM_ID = "origem";

	private static final int NUM_LINHA_TITULO = 0;
	private static final int NUM_LINHA_PERIODO = 1;
	private static final int NUM_FAIXA_HORARIA = 2;
	private static final int NUM_LINHA_DATA_EMPRESA = 3;
	private static final int NUM_LINHA_INICIO = 4;

	private Empresa empresa;
	private Ruta ruta;
	private OrgaoConcedente orgao;
	private Parada origem;
	private int total;
	private Map<String, Integer> mapAux = new HashMap<String, Integer>();

	private List<RelatorioEmbarqueLocalidadeBean> ls;

	private void executarRelatorio() throws Exception {

		empresa = cmbEmpresa.getSelectedItem() != null ? (Empresa) cmbEmpresa.getSelectedItem().getValue() : null;
		ruta = cmbRuta.getSelectedItem() != null ? (Ruta) cmbRuta.getSelectedItem().getValue() : null;
		orgao = cmbOrgaoConcedente.getSelectedItem() != null ? (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue() : null;
		origem = cmbOrigem.getSelectedItem() != null ? (Parada) cmbOrigem.getSelectedItem().getValue() : null;

		SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");
		SimpleDateFormat hf = new SimpleDateFormat("HH:mm:ss");
		String fecInicio = sdf.format(this.datInicial.getValue()) + " 00:00:00";
		String fecFinal = sdf.format(this.datFinal.getValue()) + " 23:59:59";
		String horInicio = horInicial.getValue() != null ? hf.format(horInicial.getValue()) : "";
		String horFim = horFinal.getValue() != null ? hf.format(horFinal.getValue()) : "";

		Connection connection = null;

		try {
			connection = getConnectionRead();

			String sql = getSql(empresa, ruta != null ? ruta.getRutaId().toString() : null,
					orgao != null ? orgao.getOrgaoConcedenteId().toString() : null,
					origem != null ? origem.getParadaId().toString() : null, horInicio, horFim);

			NamedParameterStatement stmt = new NamedParameterStatement(connection, sql);

			stmt.setString(FILED_FEC_INICIO, fecInicio);
			stmt.setString(FIELD_FEC_FINAL, fecFinal);
			if (empresa != null) {
				stmt.setInt(FIELD_EMPRESA_ID, empresa.getEmpresaId());
			}

			if (ruta != null && !"-1".equals(ruta.getRutaId().toString())) {
				stmt.setInt(FIELD_RUTA_ID, ruta.getRutaId());
			}

			if (orgao != null) {
				stmt.setInt(FIELD_ORGAO_CONCEDENTE_ID, orgao.getOrgaoConcedenteId());
			}

			if (origem != null) {
				stmt.setInt(FIELD_ORIGEM_ID, origem.getParadaId());
			}

			if (!horInicio.isEmpty() && !horFim.isEmpty()) {
				stmt.setString(FIELD_HOR_INICIO, horInicio);
				stmt.setString(FIELD_HOR_FINAL, horFim);
			}

			ResultSet rset = stmt.executeQuery();

			Map<String, Map<String, List<RelatorioEmbarqueLocalidadeBean>>> datas = resultSetToList(rset);
			exportaExcel(datas);

			rset.close();
			stmt.close();

		} catch (Exception e) {
			empresa = null;
			ruta = null;
			orgao = null;
			origem = null;
			lsEmpresas = empresaService.obtenerTodos();
			lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodos();
			lsOrigens = paradaService.obtenerTodos();
			lsRutas = rutaService.obtenerTodos();
			log.error("", e);
		} finally {
			try {
				if (connection != null && !connection.isClosed()) {
					connection.close();
				}
			} catch (SQLException e) {
				log.error("error fechar conexão", e);

				throw new RuntimeException(e);
			}
		}
	}

	private Connection getConnectionRead() {
		return DataSourceUtils.getConnection(dataSourceRead);
	}

	private void exportaExcel(Map<String, Map<String, List<RelatorioEmbarqueLocalidadeBean>>> datas) {
		try {
			HSSFWorkbook wb = new HSSFWorkbook(); 
			
			HSSFSheet sheet1 = null;
			String dataAtual = DateUtil.getStringDate(new Date(),"dd-MM-yy");
			sheet1 = wb.createSheet(dataAtual);
			geraCabecalho(sheet1, dataAtual, wb);			

			HSSFFont font = wb.createFont();
			HSSFCellStyle style = wb.createCellStyle();
			font.setFontName(HSSFFont.FONT_ARIAL);
			font.setFontHeightInPoints((short) 10);
			font.setBoldweight(Font.BOLDWEIGHT_BOLD);
			font.setColor(HSSFColor.RED.index);			
			style.setFont(font);
			
			
			HSSFFont fonteTotal = wb.createFont();	
			fonteTotal.setColor(HSSFColor.RED.index);
	        HSSFCellStyle styleTotal = wb.createCellStyle();
	        styleTotal.setAlignment(HSSFCellStyle.ALIGN_CENTER);	  
	        styleTotal.setFont(fonteTotal);
			
			int linha = NUM_LINHA_INICIO;
			HSSFRow row = null;
			

			Map<String, Integer> linhas = new HashMap<String, Integer>();
			int totalGeral = 0;

			int linhaTotalizador = 6;
			HSSFCell cellTotal = null;
			
			HSSFCellStyle estiloVerticalMerge = wb.createCellStyle();
			estiloVerticalMerge.setAlignment(CellStyle.ALIGN_CENTER);
			estiloVerticalMerge.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
			
			for (RelatorioEmbarqueLocalidadeBean bean : ls) {

				int indexColun = mapAux.get(bean.getHorario());

				if (!linhas.containsKey(bean.getPrefixo()+bean.getLinha())) {
					linhas.put(bean.getPrefixo()+bean.getLinha(), linha);
					row = sheet1.createRow(linha);
					linhaTotalizador = linha;
					linha++;

				} else {
					row = sheet1.getRow(linhas.get(bean.getPrefixo()+bean.getLinha()));
					linhaTotalizador = sheet1.getRow(linhas.get(bean.getPrefixo()+bean.getLinha())).getRowNum();
				}

				HSSFCell cellHorario = row.createCell(0);
				cellHorario.setCellStyle(estiloVerticalMerge);

				cellTotal = row.createCell(mapAux.size() + 3);

				row.createCell(indexColun).setCellValue(bean.getEmbarques());
				row.createCell(0).setCellValue(bean.getPrefixo());
				row.createCell(1).setCellValue(bean.getClasse());
				row.createCell(2).setCellValue(bean.getLinha());				
				cellTotal.setCellStyle(styleTotal);
				String colluna;
				String celTotal;
				colluna = CellReference.convertNumToColString(mapAux.size() + 2);
				celTotal = "SUM(D" + (linhaTotalizador + 1) + ":" + colluna + (linhaTotalizador + 1) + ")";
				row.createCell(mapAux.size() + 3).setCellValue(celTotal);
				cellTotal.setCellFormula(celTotal);


				totalGeral += bean.getEmbarques();
			}
			
			

			row = sheet1.createRow(linha+3);
			int qtdLinhas = linhas.size() + 4;

			int somatorioColuna = 3;
			

	        
			for (int i = 3; i < mapAux.size() + 3; i++) {

				String colluna = CellReference.convertNumToColString(i);
				cellTotal = row.createCell(somatorioColuna);
				cellTotal.setCellFormula("SUM(" + colluna + 5 + ":" + colluna + (qtdLinhas) + ")");
				cellTotal.setCellStyle(styleTotal);
				somatorioColuna++;

			}
			
			sheet1.addMergedRegion(new CellRangeAddress(
					linha+3, // first row (0-based)
					linha+3 , // last row (0-based)
					0, // first column (0-based)
					2 // last column (0-based)
			));
			
			
			HSSFCell cellTotalPorFaixaEtaria = row.createCell(0);
			cellTotalPorFaixaEtaria.setCellValue("TOTAL POR FAIXA HORÁRIA");
	        cellTotalPorFaixaEtaria.setCellStyle(styleTotal);

			HSSFCell cellTotalValue = row.createCell(total);
			cellTotalValue = row.createCell(mapAux.size() + 3);
			String celTotalizadorGeral;
			String colluna = CellReference.convertNumToColString(mapAux.size() + 2);
			celTotalizadorGeral = "SUM(D" + (linha+4) + ":" + colluna + (linha+4) + ")";
			cellTotalValue.setCellFormula(celTotalizadorGeral);
			cellTotalValue.setCellStyle(styleTotal);

			linha = NUM_LINHA_INICIO;

			for (int i = 0; i <= total; i++) {
				sheet1.autoSizeColumn(i);
			}

			if (mapAux.isEmpty()) {
				Messagebox.show(
						Labels.getLabel("relatorio.parametro.msgNoData"),
						Labels.getLabel("relatorioEmbarqueLocalidadeController.window.title"),
						Messagebox.OK, Messagebox.INFORMATION);
				return;
			}
	
			downloadArquivo(wb);
			
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
			
		}
	}
	
	
	private void downloadArquivo(HSSFWorkbook wb) throws Exception {

		String nomeArquivo = UsuarioLogado.getUsuarioLogado().getNombusuario() + "_" + Calendar.getInstance().getTime().getTime() + "_" + "EmbarqueLocalidade.xls";
		String contentType = "application/vnd.ms-excel";

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		wb.write(bos);

		File arquivo = File.createTempFile(nomeArquivo, ".xls");

		FileOutputStream fos = new FileOutputStream(arquivo);
		fos.write(bos.toByteArray());
		fos.close();

		InputStream isFile = new FileInputStream(arquivo);
		nomeArquivo = arquivo.getName();

		Filedownload.save(isFile, contentType, nomeArquivo);

		if (arquivo != null) {
			arquivo.delete();
		}
    }

	private void geraCabecalhoTitulo(HSSFSheet sheet1, HSSFWorkbook wb,Integer somaColuna, String nomeEmpresa) {
		HSSFRow titulo = sheet1.createRow(NUM_LINHA_TITULO);
		sheet1.addMergedRegion(new CellRangeAddress(
				NUM_LINHA_TITULO, // first row (0-based)
				NUM_LINHA_TITULO, // last row (0-based)
				0, // first column (0-based)
				somaColuna // last column (0-based)
		));
		
		

		HSSFFont fonteTitulo = wb.createFont();
		fonteTitulo.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
		fonteTitulo.setColor(HSSFColor.RED.index);
//		fonteTitulo.setFontHeight((short) 12);
		HSSFCellStyle estilo = wb.createCellStyle();		
		
		HSSFCell cell = titulo.createCell(0);
        cell.setCellValue(nomeEmpresa);
        HSSFCellStyle styleTitulo = wb.createCellStyle();
        styleTitulo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        styleTitulo.setFont(fonteTitulo);
       
        cell.setCellStyle(styleTitulo);
		titulo.setRowStyle(estilo);
	}


	private void geraCabecalhoPeriodo(HSSFSheet sheet1,HSSFWorkbook wb,Integer somaColuna) {
			HSSFRow periodo = sheet1.createRow(NUM_LINHA_PERIODO);
			SimpleDateFormat sdf = new SimpleDateFormat("dd/MM/yyyy");

			sheet1.addMergedRegion(new CellRangeAddress(
					NUM_LINHA_PERIODO, // first row (0-based)
					NUM_LINHA_PERIODO, // last row (0-based)
					0, // first column (0-based)
					somaColuna // last column (0-based)
			));
			 HSSFCell cell = periodo.createCell(0);
			 cell.setCellValue("PASSAGEIROS EMBARCADOS TERMINAL RODOVIARIO " + cmbOrigem.getValue() + " Período: " + sdf.format(this.datInicial.getValue()) + " a " + sdf.format(this.datFinal.getValue()));
	        
			 HSSFFont fontePeriodo= wb.createFont();
			 fontePeriodo.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);			
			 fontePeriodo.setFontHeight((short) 11);		
			 
			 HSSFCellStyle stylePeriodo = wb.createCellStyle();
	         stylePeriodo.setAlignment(HSSFCellStyle.ALIGN_CENTER);
	         cell.setCellStyle(stylePeriodo);
	}
	
	private void geraCabecalho(HSSFSheet sheet1, String dataAtual, HSSFWorkbook wb) {		

		HSSFRow r1 = sheet1.createRow(NUM_LINHA_DATA_EMPRESA);
		List<RelatorioEmbarqueLocalidadeBean> lsAux = new ArrayList<RelatorioEmbarqueLocalidadeBean>();

		mapAux = new HashMap<String, Integer>();
		Map<String, Integer> map = new HashMap<String, Integer>();

		int i = 3;
		for (RelatorioEmbarqueLocalidadeBean bean : ls) {

			if (map.containsKey(bean.getHorario())) {
				Integer indice = map.get(bean.getHorario());
				map.put(bean.getHorario(), indice);
				bean.setIndexColun(indice);
			} else {
				map.put(bean.getHorario(), i);
				bean.setIndexColun(i);
				i++;
			}
			lsAux.add(bean);
		}
		

		String valorEmpresa= empresa==null? "EMPRESA: TODOS" :"EMPRESA: " + empresa.getNombempresa();
		
		geraCabecalhoTitulo(sheet1, wb, i, valorEmpresa);
		
		geraCabecalhoPeriodo(sheet1, wb,i );
		
		sheet1.addMergedRegion(new CellRangeAddress(
				NUM_FAIXA_HORARIA, // first row (0-based)
				NUM_FAIXA_HORARIA+1 , // last row (0-based)
				0, // first column (0-based)
				2 // last column (0-based)
		));
		
		 HSSFFont fontCodigoNomeLinha = wb.createFont();
		 fontCodigoNomeLinha.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD); 

		 
		 HSSFCellStyle estiloCellCodigoNomeLinha = wb.createCellStyle();  
         estiloCellCodigoNomeLinha.setAlignment(HSSFCellStyle.ALIGN_CENTER);
         estiloCellCodigoNomeLinha.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
         estiloCellCodigoNomeLinha.setFont(fontCodigoNomeLinha);
		
	     HSSFRow periodo = sheet1.createRow(NUM_FAIXA_HORARIA);
		 HSSFCell cell = periodo.createCell(0);
		 cell.setCellValue("CÓDIGO- NOME DA LINHA");        
         cell.setCellStyle(estiloCellCodigoNomeLinha);
        
         
     	 sheet1.addMergedRegion(new CellRangeAddress(
				NUM_FAIXA_HORARIA, // first row (0-based)
				NUM_FAIXA_HORARIA , // last row (0-based)
				3, // first column (0-based)
				i==3?3:i-1 // last column (0-based)
		 ));
     	 
     	 sheet1.addMergedRegion(new CellRangeAddress(
 				NUM_FAIXA_HORARIA, // first row (0-based)
 				NUM_FAIXA_HORARIA+1 , // last row (0-based)
 				i, // first column (0-based)
 				i // last column (0-based)
 		 ));
     	
     	 HSSFCell cell1 = periodo.createCell(3);
     	 cell1.setCellValue("FAIXA HORÁRIA");
     	 cell1.setCellStyle(estiloCellCodigoNomeLinha);
     	 
        i = 3;
		mapAux = new TreeMap<String, Integer>(map);
		HSSFFont fontHorario = wb.createFont();
		HSSFCellStyle styleHorario = wb.createCellStyle();	
		fontHorario.setBoldweight(Font.BOLDWEIGHT_BOLD);
		styleHorario.setFont(fontHorario);
		styleHorario.setAlignment(HSSFCellStyle.ALIGN_CENTER);
		styleHorario.setVerticalAlignment(HSSFCellStyle.ALIGN_CENTER);
		
		for (Entry<String, Integer> bean : mapAux.entrySet()) {
			r1.createCell(bean.getValue()).setCellValue(bean.getKey());
			r1.getCell(bean.getValue()).setCellStyle(styleHorario);
			i++;
		}
		r1.setRowStyle(styleHorario);
		
		HSSFCellStyle styleTituloTotal = wb.createCellStyle();	
		HSSFCell cellTituloTotal = periodo.createCell(i++);
		cellTituloTotal.setCellValue("TOTAL");
		styleTituloTotal.setAlignment(HSSFCellStyle.ALIGN_CENTER);		
		styleTituloTotal.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
		
		HSSFFont fontTituloTotal = wb.createFont();	
		fontTituloTotal.setBoldweight(Font.BOLDWEIGHT_BOLD);
		fontTituloTotal.setFontHeightInPoints((short) 10);
		fontTituloTotal.setColor(HSSFColor.RED.index);
		styleTituloTotal.setFont(fontTituloTotal);
		cellTituloTotal.setCellStyle(styleTituloTotal);	
	
		total = i;
	}

	public void onClick$btnExecutarRelatorio(Event ev) throws Exception {
		executarRelatorio();
	}

	@Override
	public void doAfterCompose(Component comp) throws Exception {
		super.doAfterCompose(comp);

		lsEmpresas = empresaService.obtenerTodos();
		lsOrgaosConcedentes = orgaoConcedenteService.obtenerTodos();
		
	}

	public void onSelect$cmbOrgaoConcedente(Event ev) throws Exception {
		
		try {
			OrgaoConcedente orgao = cmbOrgaoConcedente.getSelectedItem() != null ? (OrgaoConcedente) cmbOrgaoConcedente.getSelectedItem().getValue() : null;
			if(cmbRuta.getItems() != null) {
				cmbRuta.getItems().clear();
			}
			if(orgao != null) {
				lsRutas = orgao != null ? rutaService.buscaSomenteRutasFromOrgao(orgao) : rutaService.obtenerTodos();
				cmbRuta.setModel(new ListModelList(lsRutas));
			}
		} catch (Exception e) {
			log.error("", e);
		}

	}

	public void onSelect$cmbRuta(Event ev) throws Exception {
		
		try {
			Ruta ruta = cmbRuta.getSelectedItem() != null ? (Ruta) cmbRuta.getSelectedItem().getValue() : null;
			if(cmbOrigem.getItems() != null) {
				cmbOrigem.getItems().clear();
			}
			if(ruta != null) {
				lsOrigens = ruta != null ? paradaService.obtenerOrigenPorRuta(ruta) : paradaService.obtenerTodos();
				cmbOrigem.setModel(new ListModelList(lsOrigens));
			}
		} catch (Exception e) {
			log.error("", e);
		}
		

	}

	protected String getSql(Empresa empresa, String ruta, String orgao, String origem, String horInicio, String horFim) {
		StringBuilder sql = new StringBuilder();

		sql.append("select ");
		sql.append("	concat(concat(concat(TO_CHAR(b.fechorviaje,'HH24'), ':00'), ' a '),concat(TO_CHAR(b.fechorviaje,'HH24'), ':59')),  ");
		sql.append("	r.descruta, cla.descclase, ");
		sql.append("	count(b.boleto_id), r.prefixo  ");
		sql.append("from  ");
		sql.append("	boleto b ");
		sql.append("	inner join ruta r on r.ruta_id = b.ruta_id ");
		sql.append("	inner join clase_servicio cla on cla.claseservicio_id = r.claseservicio_id ");
		sql.append("	inner join marca m on m.marca_id = b.marca_id ");
		sql.append("where  ");
		sql.append("	b.fechorviaje between TO_DATE(:fecInicio, 'DD/MM/YYYY HH24:MI:SS') AND TO_DATE(:fecFinal, 'DD/MM/YYYY HH24:MI:SS')  ");
		if (!horInicio.isEmpty() && !horFim.isEmpty()) {
			sql.append("    and TO_CHAR(b.fechorviaje, 'HH24:MI:SS') between :horInicio AND :horFinal  ");
		}
		sql.append("    and b.motivocancelacion_id is null and b.numasiento is not null and b.indstatusoperacion = 'F' ");
		if (orgao != null && !orgao.isEmpty()) {
			sql.append("	and r.orgaoconcedente_id = :orgao ");
		}
		if (empresa != null) {
			sql.append("	and m.empresa_id = :empresa ");
		}
		if (ruta != null && !ruta.isEmpty() && !ruta.equals("-1")) {
			sql.append("	and b.ruta_id = :ruta ");
		}
		if (origem != null && !origem.isEmpty()) {
			sql.append("    and b.origen_id = :origem ");
		}

		sql.append("group by ");
		sql.append("	concat(concat(concat(TO_CHAR(b.fechorviaje,'HH24'), ':00'), ' a '),concat(TO_CHAR(b.fechorviaje,'HH24'), ':59')),   ");
		sql.append("	r.descruta, cla.descclase,r.prefixo ");
		sql.append("order by ");
		sql.append("	1 ");

		return sql.toString();
	}

	protected Map<String, Map<String, List<RelatorioEmbarqueLocalidadeBean>>> resultSetToList(ResultSet rset) throws SQLException {

		Map<String, Map<String, List<RelatorioEmbarqueLocalidadeBean>>> datas = new LinkedHashMap<String, Map<String, List<RelatorioEmbarqueLocalidadeBean>>>();
		ls = new ArrayList<RelatorioEmbarqueLocalidadeBean>();

		while (rset.next()) {
			RelatorioEmbarqueLocalidadeBean bean = new RelatorioEmbarqueLocalidadeBean();
			bean.setHorario(rset.getString(1));
			bean.setLinha(rset.getString(2));
			bean.setClasse(rset.getString(3));
			bean.setEmbarques(rset.getLong(4));
			bean.setPrefixo(rset.getString(5));
			ls.add(bean);
		}

		return datas;
	}

	public void checarLinhasDuplicadas() {

	}

	public Datebox getDatInicial() {
		return datInicial;
	}

	public void setDatInicial(Datebox datInicial) {
		this.datInicial = datInicial;
	}

	public Datebox getDatFinal() {
		return datFinal;
	}

	public void setDatFinal(Datebox datFinal) {
		this.datFinal = datFinal;
	}

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

	public List<Empresa> getLsEmpresas() {
		return lsEmpresas;
	}

	public void setLsEmpresas(List<Empresa> lsEmpresas) {
		this.lsEmpresas = lsEmpresas;
	}

	public List<OrgaoConcedente> getLsOrgaosConcedentes() {
		return lsOrgaosConcedentes;
	}

	public void setLsOrgaosConcedentes(List<OrgaoConcedente> lsOrgaosConcedentes) {
		this.lsOrgaosConcedentes = lsOrgaosConcedentes;
	}

	public List<Ruta> getLsRutas() {
		return lsRutas;
	}

	public void setLsRutas(List<Ruta> lsRutas) {
		this.lsRutas = lsRutas;
	}

	public Timebox getHorInicial() {
		return horInicial;
	}

	public void setHorInicial(Timebox horInicial) {
		this.horInicial = horInicial;
	}

	public Timebox getHorFinal() {
		return horFinal;
	}

	public void setHorFinal(Timebox horFinal) {
		this.horFinal = horFinal;
	}

	public List<Parada> getLsOrigens() {
		return lsOrigens;
	}

	public void setLsOrigens(List<Parada> lsOrigens) {
		this.lsOrigens = lsOrigens;
	}

}
