/**
 * 
 */
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.List;
import java.util.Map;

import org.apache.commons.lang.StringUtils;

import com.rjconsultores.ventaboletos.relatorios.utilitarios.ArrayDataSource;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.Relatorio;
import com.rjconsultores.ventaboletos.relatorios.utilitarios.RelatorioResumoVendaOrgaoConcedenteBean;
import com.rjconsultores.ventaboletos.utilerias.DateUtil;
import com.rjconsultores.ventaboletos.utilerias.MoneyHelper;
import com.rjconsultores.ventaboletos.web.utilerias.NamedParameterStatement;

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

/**
 * @author Wallace
 *
 */
public class RelatorioResumoVendaOrgaoConcedente extends Relatorio {

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

	private List<RelatorioResumoVendaOrgaoConcedenteBean> 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 sb = new StringBuilder();

				sb.append("SELECT ");
				sb.append("       BOLETO.PONTOVENTA,");
				sb.append("       COALESCE(SUM(CASE WHEN BOLETO.ORGAOCONCEDENTEID IN(3) THEN BOLETO.PRECIOBOLETO END),0) - SUM(BOLETO.CANCELANTT) AS ANTT,");
				sb.append("       COALESCE(SUM(CASE WHEN BOLETO.ORGAOCONCEDENTEID IN(27) THEN BOLETO.PRECIOBOLETO END ),0) - SUM(BOLETO.CANCELAGERBA) AS AGERBA, ");
				sb.append("	      COALESCE(SUM(BOLETO.IMPORTECCREDITO) ,0) AS CARTAO,");
				sb.append("	      COALESCE(SUM(CASE WHEN BOLETO.ORGAOCONCEDENTEID IN(27,3) THEN BOLETO.PRECIOBOLETO END),0) - SUM(BOLETO.CANCELANTT+BOLETO.CANCELAGERBA) AS VALORBASECALCULO,  ");
				sb.append("       COALESCE(SUM(CASE WHEN BOLETO.INDTRIBTARIFA IN(1) THEN BOLETO.PRECIOBOLETO END),0) AS ISENTO, ");
				sb.append("       BOLETO.NOMEESTADO AS NOMEESTADO "); 
				sb.append("FROM ");
				sb.append("  (SELECT PV.NOMBPUNTOVENTA AS PONTOVENTA,");
				sb.append("          OC.DESCORGAO AS ORGAO,");
				sb.append("          OC.ORGAOCONCEDENTE_ID AS ORGAOCONCEDENTEID,");
				sb.append("          (SELECT sum(cf.importe) FROM CAJA_FORMAPAGO cf WHERE cf.CAJA_ID=c.CAJA_ID AND cf.FORMAPAGO_ID IN (2,3) ) AS IMPORTECCREDITO, ");
				sb.append("          CASE WHEN C.MOTIVOCANCELACION_ID IS NULL THEN C.PRECIOPAGADO ELSE 0 END AS PRECIOBOLETO, ");
				sb.append("          CASE WHEN ((C.INDCANCELACION = 1 AND c.MOTIVOCANCELACION_ID NOT IN ( 34,  36,37, 99))  or (C.INDCANCELACION in(0)  AND c.MOTIVOCANCELACION_ID   IN (35)))  AND OC.ORGAOCONCEDENTE_ID = 3 THEN (C.PRECIOPAGADO) ELSE 0 END AS CANCELANTT, ");
				sb.append("          CASE WHEN ((C.INDCANCELACION = 1 AND c.MOTIVOCANCELACION_ID NOT IN ( 34,  36,37, 99))  or (C.INDCANCELACION in(0)  AND c.MOTIVOCANCELACION_ID   IN (35)))  AND OC.ORGAOCONCEDENTE_ID = 27 THEN (C.PRECIOPAGADO) ELSE 0 END AS CANCELAGERBA, ");
				sb.append("		  	 EI.PORCREDBASEICMS,");
				sb.append("          EST_PUNTOVENTA.NOMBESTADO AS NOMEESTADO, ");
				sb.append("          CS.DESCCLASE AS NOMECLASSE, ");
				sb.append("          R.INDTRIBTARIFA AS  INDTRIBTARIFA ");
				sb.append("		  ");
				sb.append("   FROM CAJA C");
				sb.append("   INNER JOIN PUNTO_VENTA PV ON C.PUNTOVENTA_ID = PV.PUNTOVENTA_ID and pv.activo = 1");
				sb.append("   INNER JOIN RUTA R ON (C.RUTA_ID = R.RUTA_ID)");
				sb.append("   INNER JOIN ORGAO_CONCEDENTE OC ON (R.ORGAOCONCEDENTE_ID = OC.ORGAOCONCEDENTE_ID)");
				sb.append("   INNER JOIN PARADA ORI ON C.ORIGEN_ID = ORI.PARADA_ID");
				sb.append("   INNER JOIN CIUDAD CO ON CO.CIUDAD_ID = ORI.CIUDAD_ID");
				sb.append("   INNER JOIN ESTADO EST ON EST.ESTADO_ID = CO.ESTADO_ID  and EST.activo = 1");
				sb.append("   INNER JOIN PARADA ORI_PUNTOVENTA ON PV.PARADA_ID = ORI_PUNTOVENTA.PARADA_ID");
				sb.append("   INNER JOIN CIUDAD CO_PUNTOVENTA ON CO_PUNTOVENTA.CIUDAD_ID = ORI_PUNTOVENTA.CIUDAD_ID");
				sb.append("   INNER JOIN ESTADO EST_PUNTOVENTA ON EST_PUNTOVENTA.ESTADO_ID = CO_PUNTOVENTA.ESTADO_ID  and EST_PUNTOVENTA.activo = 1");
				sb.append("   INNER JOIN empresa_imposto ei on ei.empresa_id = c.empresacorrida_id and ei.estado_id = EST.ESTADO_ID  and ei.activo = 1");
				sb.append("   INNER JOIN CLASE_SERVICIO CS ON (C.CLASESERVICIO_ID = CS.CLASESERVICIO_ID ) ");
				sb.append("   WHERE C.ACTIVO = 1");
				sb.append("  and C.FECHORVENTA >= :DATA_INICIAL ");
				sb.append("  and C.FECHORVENTA <= :DATA_FINAL ");
				sb.append("     AND C.TIPOVENTA_ID <> 6");
				sb.append("     AND C.INDREIMPRESION = 0");
				
				if (parametros.get("NUMPUNTOVENTA") != null && !parametros.get("NUMPUNTOVENTA").equals("-1")) {
					sb.append(" and C.PUNTOVENTA_ID IN (" + parametros.get("NUMPUNTOVENTA").toString() + ")");
				}
				if (parametros.get("ESTADOS_ID") != null && !parametros.get("ESTADOS_ID").equals("-1")) {
					sb.append(" and EST.estado_id in (" + parametros.get("ESTADOS_ID").toString() + ")");
				}
				if (parametros.get("EMPRESA_ID") != null && !parametros.get("EMPRESA_ID").equals("-1")) {
					sb.append(" and C.EMPRESACORRIDA_ID IN (" + parametros.get("EMPRESA_ID").toString() + ")");
				}
				if (parametros.get("CLASESERVICIO_ID") != null && !parametros.get("CLASESERVICIO_ID").toString().equals("-1")) {
					sb.append(" AND C.CLASESERVICIO_ID =  " + parametros.get("CLASESERVICIO_ID").toString() + " ");
				}
				sb.append("  ) BOLETO ");
				sb.append(" GROUP BY BOLETO.PONTOVENTA, BOLETO.NOMEESTADO "); 
				sb.append(" ORDER BY BOLETO.NOMEESTADO, BOLETO.PONTOVENTA "); 
				
				NamedParameterStatement stmt = new NamedParameterStatement(conexao, sb.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();
				rset.setFetchSize(1000);
				
				lsDadosRelatorio = new ArrayList<RelatorioResumoVendaOrgaoConcedenteBean>();
				DecimalFormat df = new DecimalFormat("0.00");  
				df.setMaximumFractionDigits(2);
				df.setRoundingMode(RoundingMode.DOWN);
				
				BigDecimal aVISTA = BigDecimal.ZERO;
				
				while (rset.next()) {

					RelatorioResumoVendaOrgaoConcedenteBean bean = new RelatorioResumoVendaOrgaoConcedenteBean();
					aVISTA = BigDecimal.ZERO;
					bean.setAgencia(StringUtils.defaultString(rset.getString("PONTOVENTA")));
					bean.setANTT(getValor("ANTT", rset));
					bean.setAGERBA(getValor("AGERBA", rset));
					bean.setCartao(getValor("CARTAO", rset));
					aVISTA = MoneyHelper.somar(bean.getANTT(), bean.getAGERBA()).subtract(bean.getCartao());
					bean.setAVista(aVISTA);
					bean.setValorBaseCalculo(getValor("VALORBASECALCULO", rset));
					bean.setNomeEstado(StringUtils.defaultString(rset.getString("NOMEESTADO")));

					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<RelatorioResumoVendaOrgaoConcedenteBean> lsDadosRelatorio) {
		this.setCollectionDataSource(new JRBeanCollectionDataSource(lsDadosRelatorio));
		this.lsDadosRelatorio = lsDadosRelatorio;
	}

}
