/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package com.rjconsultores.ventaboletos.dao.hibernate;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.Date;
import java.util.Map;

import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.stereotype.Repository;

import com.rjconsultores.ventaboletos.dao.InformeCategoriaVentaDAO;
import com.rjconsultores.ventaboletos.entidad.Empresa;
import com.rjconsultores.ventaboletos.entidad.Parada;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;
import com.rjconsultores.ventaboletos.entidad.Ruta;

/**
 *
 * @author Administrador
 */
@Repository("informeCategoriaVentaDAO")
public class InformeCategoriaVentaDAOImpl implements InformeCategoriaVentaDAO {

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

    private String getSql(PuntoVenta puntoVenta, Ruta ruta, Parada origen,
            Parada destino, Empresa empresa, Integer numServicio, Date dataInicio,
            Date dataFinal) {
        StringBuilder where = new StringBuilder();
        where.append(" WHERE 1 = 1 ");

        if (puntoVenta != null) {
            where.append(" AND pu.puntoventa_id = ").append(puntoVenta.getPuntoventaId());
        }

        if (ruta != null) {
            where.append(" AND ru.ruta_id = ").append(ruta.getRutaId());
        }

        if (origen != null) {
            where.append(" AND bo.origen_id = ").append(origen.getParadaId());
        }

        if (destino != null) {
            where.append(" AND bo.destino_id = ").append(destino.getParadaId());
        }

        if (empresa != null) {
            where.append(" AND bo.empresacorrida_id = ").append(empresa.getEmpresaId());
        }

        if (numServicio != null) {
            where.append(" AND bo.corrida_id = ").append(numServicio);
        }

        if (dataInicio != null) {
            where.append(" AND bo.feccorrida >= ? ");
        }

        if (dataFinal != null) {
            where.append(" AND bo.feccorrida <= ? ");
        }

        StringBuilder sql = new StringBuilder();
        sql.append(" SELECT bo.corrida_id, bo.feccorrida, pao.descparada origen, pad.descparada destino, ");
        sql.append("        ca.desccategoria, COUNT(*) qtde, SUM(bo.preciopagado) valor, ru.descruta, ");
        sql.append("        pu.nombpuntoventa ");
        sql.append(" FROM   boleto bo ");
        sql.append("        INNER JOIN categoria ca ON ca.categoria_id = bo.categoria_id ");
        sql.append("        INNER JOIN parada pao ON pao.parada_id = bo.origen_id ");
        sql.append("        INNER JOIN parada pad ON pad.parada_id = bo.destino_id ");
        sql.append("        INNER JOIN corrida co ON co.corrida_id = bo.corrida_id ");
        sql.append("        INNER JOIN ruta ru ON ru.ruta_id = co.ruta_id ");
        sql.append("        INNER JOIN punto_venta pu ON pu.puntoventa_id = bo.puntoventa_id ");
        sql.append(where);
        sql.append(" GROUP  BY bo.corrida_id, pao.descparada, pad.descparada, ");
        sql.append("        ca.desccategoria, bo.feccorrida, ru.descruta, pu.nombpuntoventa ");
        sql.append(" ORDER  BY ca.desccategoria ");

        return sql.toString();
    }

    public ResultSet executarSQL(Connection conn, Map parameters) {
        Ruta ruta = (Ruta) parameters.get("ruta");
        PuntoVenta puntoVenta = (PuntoVenta) parameters.get("puntoVenta");
        Empresa empresa = (Empresa) parameters.get("empresa");
        Parada origen = (Parada) parameters.get("origen");
        Parada destino = (Parada) parameters.get("destino");
        Integer numServicio = (Integer) parameters.get("numServicio");
        Date dataInicio = (Date) parameters.get("dataInicio");
        Date dataFinal = (Date) parameters.get("dataFinal");
        String sql = getSql(puntoVenta, ruta, origen, destino, empresa,
                numServicio, dataInicio, dataFinal);

        PreparedStatement stmt = null;
        ResultSet rset = null;

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setDate(1, new java.sql.Date(dataInicio.getTime()));
            stmt.setDate(2, new java.sql.Date(dataFinal.getTime()));
            rset = stmt.executeQuery();
        } catch (Exception ex) {
            log.error(ex);
        }

        return rset;
    }
}
