/**
 * 
 */
package com.rjconsultores.ventaboletos.relatorios.impl;

import java.math.BigDecimal;
import java.math.RoundingMode;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Timestamp;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.IndStatusBoleto;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioBilhetesVendidosNovoLayoutBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;

/**
 * @author Wallace
 *
 */
public class RelatorioBilhetesVendidosNovoLayout extends Relatorio {
	
	private static final String STATUS = "STATUS";
	private static final String DATA_VENDA = "DATA_VENDA";
	private static final String TIPO_DATA = "TIPO_DATA";

	public RelatorioBilhetesVendidosNovoLayout(Map<String, Object> parametros, Connection conexao) throws Exception {
		super(parametros, conexao);
	}

	private List<RelatorioBilhetesVendidosNovoLayoutBean> lsDadosRelatorio;

	@Override
	protected void processaParametros() throws Exception {

		this.setCustomDataSource(new ArrayDataSource(this) {
			@Override
			public void initDados() throws Exception {

				Connection conexao = this.relatorio.getConexao();
				Map<String, Object> parametros = this.relatorio.getParametros();

				StringBuilder sql = new StringBuilder();
				sql.append("select t.cveestado,");
				sql.append("       to_char(t.dataVenda, 'dd/MM/yy') as dataVenda, ");
				sql.append("       t.statuspassagem,");
				sql.append("       t.especie,");
				sql.append("       t.forminicial,");
				sql.append("       t.formfinal,");
				sql.append("       t.serie,");
				sql.append("       t.preciopagado AS valorcontabil,");
				sql.append("       t.preciopagado - (t.preciopagado * coalesce(t.porcentcreditobase / 100,0))AS valorbasecalculo,");
				sql.append("       t.icms as valoraliquiotaicms,");
				sql.append("        ((t.preciopagado - (t.preciopagado * coalesce(t.porcentcreditobase / 100,0))) * t.icms) / 100 AS valoricms,");
				sql.append("        cod_origem,");
				sql.append("        origem,");
				sql.append("        cod_destino,");
				sql.append("        destino, ");
				sql.append("        codFiscal ");
				sql.append("from");
				sql.append("  (select distinct ");
				sql.append("     CASE WHEN ( coalesce(al.aliquota,0) <> 0  AND co.estado_id <> cd.estado_id ) THEN AL.ALIQUOTA  			   "); //1  Aliquota do estado de destino
				sql.append("          WHEN ( EI.INDREDBASEICMSBPE = 1 and co.estado_id = cd.estado_id AND EI.ICMSIM <> 0 ) THEN EI.ICMSIM      "); //2 - ICMS intermunicipal com redutor
				sql.append("          WHEN ( EI.INDREDBASEICMSBPE = 1 and co.estado_id <> cd.estado_id AND EI.ICMS <> 0 ) THEN EI.ICMS         "); //3 - ICMS interestadual com redutor
				sql.append("          WHEN ( co.estado_id = cd.estado_id AND EI.TRIBUTACAOIMPORTACAOIM <> 0 ) THEN EI.TRIBUTACAOIMPORTACAOIM   "); //2 - ICMS intermunicipal
				sql.append("          WHEN ( co.estado_id <> cd.estado_id AND EI.TRIBUTACAOIMPORTACAO <> 0 ) THEN EI.TRIBUTACAOIMPORTACAO      "); //3 - ICMS interestadual
				sql.append("          ELSE est.icms END AS icms,              "); 																   //4 - Se nao tiver nenhum deles busca do cadastro do estado de origem
				sql.append("     (coalesce (CASE WHEN ( (co.estado_id <> cd.estado_id AND EI.INDSEGUROESTADUAL = 1) OR (co.estado_id = cd.estado_id AND EI.INDSEGUROMUNICIPAL = 1) ) THEN c.IMPORTESEGURO ELSE 0  END + ");		//1 - IMPORTE SEGURO
				sql.append("     CASE WHEN ( (co.estado_id <> cd.estado_id AND EI.INDTXEMBARQUEESTADUAL = 1) OR (co.estado_id = cd.estado_id AND EI.INDTXEMBARQUEMUNICIPAL = 1) ) THEN c.IMPORTETAXAEMBARQUE ELSE 0 END + "); 	//2 - IMPORTE TAXA
				sql.append("     CASE WHEN ( (co.estado_id <> cd.estado_id AND ei.INDPEDAGIOESTDUAL = 1) OR (co.estado_id = cd.estado_id AND EI.INDPEDAGIOMUNICIPAL = 1) ) THEN c.IMPORTEPEDAGIO ELSE 0 END , 0) "); 			//3 - IMPORTE PEGADIO
				sql.append("                    + c.preciopagado) as preciopagado, ");
				sql.append("                   est.cveestado as cveestado,");
				sql.append("                   CASE WHEN (  ei.indredbaseicmsbpe = 1 and ei.porcredbaseicmsim > 0 AND co.estado_id = cd.estado_id ) THEN ei.porcredbaseicmsim "); // 1 - Porcentagem de credito para base de calculo ICMS (INTERMUNICIPAL)
				sql.append("                   WHEN (  ei.indredbaseicmsbpe = 1 and ei.porcredbaseicms > 0  AND co.estado_id <> cd.estado_id ) THEN ei.porcredbaseicms        "); // 2 - Porcentagem de credito para base de calculo ICMS (INTERESTADUAL) 
				sql.append("                   ELSE 0 END AS porcentcreditobase,");                                                                                               // 3 - Porcentagem de credito para base de calculo ICMS (NAO EXISTENTE!) RETORNA 0
				sql.append("                   c.fechorventa as datavenda,");
				sql.append("                   c.indstatusboleto statuspassagem,");
				sql.append("                   ae.decespecie as especie,");
				sql.append("        c.numfoliosistema as forminicial,");
				sql.append("        c.numfoliosistema as formfinal,");
				sql.append("                   c.numseriepreimpresa as serie,");
				sql.append("                   c.preciopagado as valorcontabil,");
				sql.append("                   po.parada_id cod_origem, "); 
				sql.append("                   po.descparada origem,"); 
				sql.append("                   pd.parada_id cod_destino,"); 
				sql.append("                   pd.descparada destino,");
				sql.append("                   case when cd.estado_id = co.estado_id then '5357' else '6357' end as codFiscal");
				sql.append("   from caja c");
				sql.append("   left join aidf a on a.aidf_id = c.aidf_id");
				sql.append("   left join aidf_especie ae on (a.aidfesp_id = ae.aidfesp_id)");
				sql.append("   join empresa e on e.empresa_id = c.empresacorrida_id");
				sql.append("   join parada po on po.parada_id = c.origen_id");
				sql.append("   join ciudad co on co.ciudad_id = po.ciudad_id");
				sql.append("   join parada pd on pd.parada_id = c.destino_id");
				sql.append("   join ciudad cd on cd.ciudad_id = pd.ciudad_id");
				sql.append("   join estado est on est.estado_id = co.estado_id");
				sql.append("   join empresa_imposto ei on ei.empresa_id = e.empresa_id");
				sql.append("   LEFT JOIN ALIQUOTA_ESTADO_DESTINO AL ON ei.EMPRESAIMPOSTO_ID = AL.EMPRESAIMPOSTO_ID AND cd.estado_id = AL.ESTADO_ID AND AL.ACTIVO = 1 ");
				sql.append("   LEFT JOIN boleto utilizado ON (utilizado.boleto_id = c.transacaooriginal_id AND c.INDSTATUSBOLETO = 'E') ");
				sql.append("   join punto_venta pv on c.puntoventa_id = pv.puntoventa_id");
				sql.append("   and ei.estado_id = est.estado_id");
				sql.append(" where ");
				sql.append(" c.empresacorrida_id = :EMPRESA_ID ");
				if (parametros.get(TIPO_DATA) != null) {
					if ((parametros.get(TIPO_DATA).toString().equals(DATA_VENDA))) {
						sql.append(" and c.FECHORVENTA_H >= :DATA_INICIAL ");
						sql.append(" and c.FECHORVENTA_H <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_EMISSAO"))) {
						sql.append(" and utilizado.FECHORVENTA >= :DATA_INICIAL ");
						sql.append(" and utilizado.FECHORVENTA <= :DATA_FINAL ");
					}
					
					if ((parametros.get(TIPO_DATA).toString().equals("DATA_VIAGEM"))) {
						sql.append(" and c.FECCORRIDA >= :DATA_INICIAL ");
						sql.append(" and c.FECCORRIDA <= :DATA_FINAL ");
					}
				}
				sql.append(" and c.activo = 1");
				sql.append(" and ei.activo = 1");
				
				if (parametros.get(NUMPUNTOVENTA) != null && !parametros.get(NUMPUNTOVENTA).equals("-1")) {
					sql.append(" and pv.PUNTOVENTA_ID IN (" + parametros.get(NUMPUNTOVENTA).toString() + ")");
				}
				
				if (parametros.get("ESTADO_ID") != null && !parametros.get("ESTADO_ID").equals("-1")) {
					sql.append(" and est.estado_id = " + parametros.get("ESTADO_ID").toString() + "");
				}
				
				if (parametros.get("MOEDA_ID") != null) {
					sql.append(" and NVL(c.MONEDA_ID, 1) = "+parametros.get("MOEDA_ID") );
				}
				
				if (parametros.get(STATUS) != null) {
					if (parametros.get(STATUS).toString().contains("V") && parametros.get(STATUS).toString().contains("C")) {
						sql.append(" and ((c.INDSTATUSBOLETO   = 'C' AND c.MOTIVOCANCELACION_ID IS NOT NULL) OR (c.INDSTATUSBOLETO = 'V' AND c.MOTIVOCANCELACION_ID IS NULL)) ");
					} else if (parametros.get(STATUS).toString().contains("C")) {
						sql.append(" and c.INDSTATUSBOLETO   = 'C' AND c.MOTIVOCANCELACION_ID IS NOT NULL ");
					} else if (parametros.get(STATUS).toString().contains("V")) {
						sql.append(" and c.INDSTATUSBOLETO   = 'V' AND c.MOTIVOCANCELACION_ID IS NULL ");
					}
				}
				sql.append(") t ");
				sql.append("order by t.cveestado,  to_char(t.dataVenda, 'dd/MM/yy') ");
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sql.toString());

				stmt.setInt("EMPRESA_ID", Integer.valueOf(parametros.get("EMPRESA_ID").toString()));
				stmt.setTimestamp(DATA_INICIAL, new Timestamp(DateUtil.inicioFecha((Date) parametros.get(DATA_INICIAL)).getTime()));
				stmt.setTimestamp(DATA_FINAL, new Timestamp(DateUtil.fimFecha((Date) parametros.get(DATA_FINAL)).getTime()));

				ResultSet rset = stmt.executeQuery();
				lsDadosRelatorio = new ArrayList<RelatorioBilhetesVendidosNovoLayoutBean>();
				DecimalFormat df = new DecimalFormat("0.00");  
				df.setMaximumFractionDigits(2);
				df.setRoundingMode(RoundingMode.DOWN);
				
				while (rset.next()) {

					RelatorioBilhetesVendidosNovoLayoutBean bean = new RelatorioBilhetesVendidosNovoLayoutBean();

					Map<String, Object> dataResult = new HashMap<String, Object>();

					if (rset.getString("SERIE") != null) {
						if (rset.getString("SERIE").split("-").length == 1) {
							dataResult.put("SERIE", rset.getString("SERIE"));
						} else {
							dataResult.put("SERIE", rset.getString("SERIE").split("-")[0]);
							dataResult.put("SUB_SERIE", rset.getString("SERIE").split("-")[1]);
						}
					}

					if (rset.getString("statuspassagem") != null) {
						dataResult.put("statuspassagem", IndStatusBoleto.valueOf(rset.getString("statuspassagem")).getValue());
					}
					bean.setDataVenda(rset.getString("datavenda") != null ? DateUtil.changeFormatStringDate(rset.getString("datavenda"),"dd/MM/yy", "dd/MM/yyyy") : "");	
					bean.setFormInicial(StringUtils.defaultString(rset.getString("formInicial")));
					bean.setFormFinal(StringUtils.defaultString(rset.getString("formfinal")));
					bean.setSerie(StringUtils.defaultString(rset.getString("serie")));
					bean.setValorContabil(getValor("valorcontabil", rset));
					bean.setValorBaseCalculo(getValor("valorbasecalculo", rset));
					bean.setValorAliquiotaICMS(getValor("valoraliquiotaicms", rset));
					bean.setValorICMS(getValor("valoricms", rset));
					bean.setUf(StringUtils.defaultString(rset.getString("cveestado")));
					bean.setStatusPassagem((String) (rset.getObject("statuspassagem") != null && rset.getObject("statuspassagem").equals("V") ? "N" : rset.getString("statuspassagem")));
					bean.setEspecie(StringUtils.defaultString(rset.getString("especie")));
					bean.setCodFiscal(rset.getString("codFiscal"));
					bean.setCodOrigem(StringUtils.defaultString(rset.getString("cod_origem")));
					bean.setOrigem(StringUtils.defaultString(rset.getString("origem")));
					bean.setCodDestino(StringUtils.defaultString(rset.getString("cod_destino")));
					bean.setDestino(StringUtils.defaultString(rset.getString("destino")));

					lsDadosRelatorio.add(bean);

				}

				if (lsDadosRelatorio.size() > 0) {
					setLsDadosRelatorio(lsDadosRelatorio);
				}
			}
		});
	}

	private BigDecimal getValor(String campo, ResultSet resultSet) throws SQLException {
		if (resultSet.getObject(campo) == null) {
			return BigDecimal.ZERO;
		}
		return new BigDecimal(resultSet.getString(campo));
	}

	public void setLsDadosRelatorio(List<RelatorioBilhetesVendidosNovoLayoutBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

}
