/*
 * 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.InformeVentasPuntoVentaDAO;
import com.rjconsultores.ventaboletos.entidad.PuntoVenta;

/**
 *
 * @author Administrador
 */
@Repository("informeVentasPuntoVentaDAO")
public class InformeVentasPuntoVentaDAOImpl implements InformeVentasPuntoVentaDAO {

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

    private String getSql(PuntoVenta puntoVenta, Date dataInicio, Date dataFinal) {

        StringBuilder where = new StringBuilder();

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

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

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

        StringBuilder sql = new StringBuilder();
        sql.append(" SELECT vendidos.puntoventa_id, vendidos.nombpuntoventa, ");
        sql.append("        vendidos.qtde_total   AS qtde_total_vendidos, ");
        sql.append("        vendidos.valor_total  AS valor_total_vendidos, ");
        sql.append("        cancelado.qtde_total  AS qtde_total_cancelado, ");
        sql.append("        cancelado.valor_total as valor_total_cancelado ");
        sql.append(" FROM       (SELECT pu.puntoventa_id, pu.nombpuntoventa, ");
        sql.append("               COUNT(*)             qtde_total, ");
        sql.append("               SUM(bo.preciopagado) valor_total ");
        sql.append("             FROM   boleto bo ");
        sql.append("             INNER JOIN punto_venta pu ON pu.puntoventa_id = bo.puntoventa_id ");
        sql.append("             WHERE  bo.motivocancelacion_id IS NOT NULL ").append(where);
        sql.append("             GROUP  BY pu.puntoventa_id, pu.nombpuntoventa) cancelado ");
        sql.append(" INNER JOIN (SELECT pu.puntoventa_id, pu.nombpuntoventa, ");
        sql.append("               COUNT(*)             qtde_total, ");
        sql.append("               SUM(bo.preciopagado) valor_total ");
        sql.append("             FROM   boleto bo ");
        sql.append("             INNER JOIN punto_venta pu ON pu.puntoventa_id = bo.puntoventa_id ");
        sql.append("             WHERE  bo.motivocancelacion_id IS NULL ").append(where);
        sql.append("             GROUP  BY pu.puntoventa_id, pu.nombpuntoventa) vendidos ");
        sql.append(" ON cancelado.puntoventa_id = vendidos.puntoventa_id ");
        sql.append(" ORDER  BY nombpuntoventa ");

        return sql.toString();
    }

    public ResultSet executarSQL(Connection conn, Map parameters) {
        PuntoVenta puntoVenta = (PuntoVenta) parameters.get("puntoVenta");
        Date dataInicio = (Date) parameters.get("dataInicio");
        Date dataFinal = (Date) parameters.get("dataFinal");

        String sql = getSql(puntoVenta, 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()));
            stmt.setDate(3, new java.sql.Date(dataInicio.getTime()));
            stmt.setDate(4, new java.sql.Date(dataFinal.getTime()));
            rset = stmt.executeQuery();
        } catch (Exception ex) {
            log.error(ex);
        }

        return rset;
    }
}
