package br.com.elotech.social.dao.Impl;

import br.com.elotech.config.ConnectionUtil;
import br.com.elotech.enuns.SistemaEnum;
import br.com.elotech.enuns.TipoRelEnum;
import br.com.elotech.social.filters.FormatFilters;
import br.com.elotech.social.model.filters.ResumoGeralFilter;
import br.com.elotech.social.model.resumoGeral.*;
import br.com.elotech.social.scripts.ResumoGeralScript;
import br.com.elotech.util.JasperCreator;
import br.com.elotech.util.Util;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class ResumoGeral {
    private Connection conn;
    private ResultSet rs;
    private JasperCreator creator;
    private Map<String, Object> params = new HashMap<>();

    public void imprimeAtividadeColetiva(ResumoGeralFilter filter) throws Exception{
        params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
        params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
        params.put("usr_codigo", filter.getUsuarioLogado());
        if(filter.getUniCodigo() != null){
            params.put("uni_codigo", filter.getUniCodigo());
        }
        rs = Util.resolveResultSet(ResumoGeralScript.getSqlAtividadeColetiva(filter), params);
        List<AtividadeColetiva> data = new ArrayList<>();
        while(rs.next()){
            AtividadeColetiva ac = new AtividadeColetiva();
            ac.setGruDescricao(rs.getString("gru_descricao"));
            ac.setGruQtdePermitida(rs.getInt("gru_qtde_permitida"));
            ac.setEncTitulo(rs.getString("enc_titulo"));
            ac.setEncDescricao(rs.getString("enc_descricao"));
            ac.setEncEstabelecimento(rs.getString("enc_estabelecimento"));
            ac.setEncData(rs.getDate("enc_data"));
            ac.setEncQtdeParticipante(rs.getInt("qtde_participantes"));
            ac.setEncQtdePresente(rs.getInt("qtde_presente"));
            ac.setEncQtdeFalta(rs.getInt("qtde_falta"));
            if(filter.getTp_rel().equals(TipoRelEnum.ANALITICO)){
                Map<String, Object> p2 = new HashMap<>();
                p2.put("enc_codigo", rs.getInt("enc_codigo"));
                ResultSet rsp = Util.resolveResultSet(ResumoGeralScript.getSqlAtividadeColetivaParticipantes(), p2);
                while(rsp.next()){
                    AtividadeColetivaParticipantes acp = new AtividadeColetivaParticipantes();
                    acp.setCidadao(rsp.getString("cidadao"));
                    acp.setDtNascimento(rsp.getDate("dt_nascimento"));
                    acp.setIdade(rsp.getInt("idade"));
                    acp.setTelefone(rsp.getString("telefone"));
                    acp.setCelular(rsp.getString("celular"));
                    acp.setStatus(rsp.getString("status"));
                    ac.getParticipantes().add(acp);
                }
            }
            data.add(ac);
        }

        String titulo = "Relatório Atividade Coletiva";
        String filename = filter.getTipo().toLowerCase();
        creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
        creator.setFiltro(FormatFilters.filterResumoGeral(filter));
        creator.gerarPdf();
    }

    public void imprimeBeneficiosOfertados(ResumoGeralFilter filter) throws Exception{
        conn = ConnectionUtil.getConnection();
        params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
        params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
        params.put("usr_codigo", filter.getUsuarioLogado());
        if(filter.getUniCodigo() != null){
            params.put("uni_codigo", filter.getUniCodigo());
        }
        rs = Util.subResultSet(ResumoGeralScript.getSqlBeneficiosOfertados(filter), params, conn);
        List<BeneficiosOfertados> data = new ArrayList<>();
        while(rs.next()){
            BeneficiosOfertados bo = new BeneficiosOfertados();
            bo.setUnidade(rs.getString("unidade"));
            bo.setBeneficio(rs.getString("beneficio"));
            bo.setQtdeBeneficio(rs.getInt("quantidade"));
            if(filter.getTp_rel().equals(TipoRelEnum.ANALITICO)){
                Map<String, Object> pBen = new HashMap<>();
                pBen.put("ben_codigo", rs.getInt("ben_codigo"));
                pBen.put("uni_codigo", rs.getInt("uni_codigo"));
                pBen.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
                pBen.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
                ResultSet rsBen = Util.subResultSet(ResumoGeralScript.getSqlBeneficiosPorBeneficiario(), pBen, conn);
                while(rsBen.next()){
                    BeneficioBeneficiario bb = new BeneficioBeneficiario();
                    bb.setBeneficiario(rsBen.getString("beneficiario"));
                    bb.setDtCadastro(rsBen.getDate("dt_cadastro"));
                    bb.setDtEntrega(rsBen.getDate("dt_entrega"));
                    bb.setConcedido(rsBen.getString("concedido"));
                    bb.setSituacao(rsBen.getString("situacao"));
                    bb.setQtdeBeneficiario(rsBen.getInt("quantidade"));

                    bo.getBeneficiarios().add(bb);
                }
            }
            data.add(bo);
        }

        String filename = filter.getTipo().toLowerCase();
        String titulo = "Relatório de Benefícios";
        creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
        creator.setFiltro(FormatFilters.filterResumoGeral(filter));
        creator.gerarPdf();
    }

    public void imprimeAtendimentoBasico(ResumoGeralFilter filter) throws Exception {
        params.put("dt_inicial", Util.dateToTimeStamp(filter.getDtInicial()));
        params.put("dt_final", Util.dateToTimeStamp(filter.getDtFinal()));
        params.put("usr_codigo", filter.getUsuarioLogado());
        if(filter.getUniCodigo() != null){
            params.put("uni_codigo", filter.getUniCodigo());
        }
        rs = Util.resolveResultSet(ResumoGeralScript.getSqlAtendimentoBasico(filter), params);
        List<AtendimentoBasico> data = new ArrayList<>();
        while (rs.next()){
            AtendimentoBasico ab = new AtendimentoBasico();
            ab.setUnidade(rs.getString("unidade"));
            ab.setTipoAtendimento(rs.getString("tipo_atendimento"));
            ab.setProfissional(rs.getString("profissional"));
            ab.setMotivo(rs.getString("motivo"));
            ab.setData(rs.getDate("data"));
            ab.setQuantidade(rs.getInt("quantidade"));
            data.add(ab);
        }

        String filename = filter.getTipo().toLowerCase();
        String titulo = "Relatório de Atendimento Básico";
        creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
        creator.setFiltro(FormatFilters.filterResumoGeral(filter));
        creator.gerarPdf();
    }

    public void imprimeRelatorioGeral(ResumoGeralFilter filter) throws Exception {
        conn = ConnectionUtil.getConnection();
        Timestamp dtInicial = Util.dateToTimeStamp(filter.getDtInicial());
        Timestamp dtFinal = Util.dateToTimeStamp(filter.getDtFinal());
        params.put("dt_inicial", dtInicial);
        params.put("dt_final", dtFinal);
        params.put("usr_codigo", filter.getUsuarioLogado());
        if(filter.getUniCodigo() != null){
            params.put("uni_codigo", filter.getUniCodigo());
        }
        rs = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral(filter), params, conn);
        List<RelatorioGeral> data = new ArrayList<>();
        while (rs.next()){
            RelatorioGeral relatorioGeral = new RelatorioGeral();
            relatorioGeral.setUsuCodigo(rs.getLong("usu_codigo"));
            relatorioGeral.setUsuNome(rs.getString("usu_nome"));
            relatorioGeral.setTipo(filter.getTp_rel().name());

            //Atendimento
            Map<String, Object> pAte = new HashMap<>();
            pAte.put("dt_inicial", dtInicial);
            pAte.put("dt_final", dtFinal);
            pAte.put("usu_codigo", relatorioGeral.getUsuCodigo());
            pAte.put("uni_codigo", rs.getInt("uni_codigo"));
            ResultSet rsAte  = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral_atendimento(filter), pAte, conn);
            while (rsAte.next()){
                RelatorioGeralAtendimento rga = new RelatorioGeralAtendimento();
                rga.setUnidade(rsAte.getString("unidade"));
                rga.setTipoAtendimento(rsAte.getString("tipo_atendimento"));
                rga.setProfissional(rsAte.getString("profissional"));
                rga.setMotivos(rsAte.getString("motivos"));
                rga.setDataAtendimento(rsAte.getDate("data_atendimento"));
                relatorioGeral.getAtendimentos().add(rga);
            }


            //Beneficios
            Map<String, Object> pBen = new HashMap<>();
            pBen.put("dt_inicial", dtInicial);
            pBen.put("dt_final", dtFinal);
            pBen.put("usu_codigo", relatorioGeral.getUsuCodigo());
            pBen.put("uni_codigo", rs.getInt("uni_codigo"));
            ResultSet rsBen  = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral_beneficios(filter), pBen, conn);
            while (rsBen.next()){
                RelatorioGeralBeneficio rgb = new RelatorioGeralBeneficio();
                rgb.setBeneficio(rsBen.getString("beneficio"));
                rgb.setAtendente(rsBen.getString("atendente"));
                rgb.setDataCadastro(rsBen.getDate("data_cadastro"));
                rgb.setDataEntrega(rsBen.getDate("data_entrega"));
                rgb.setQuantidade(rsBen.getInt("quantidade"));
                relatorioGeral.getBeneficios().add(rgb);
            }

            //Encaminhamento
            Map<String, Object> pEnc = new HashMap<>();
            pEnc.put("dt_inicial", dtInicial);
            pEnc.put("dt_final", dtFinal);
            pEnc.put("usu_codigo", relatorioGeral.getUsuCodigo());
            pEnc.put("uni_codigo", rs.getInt("uni_codigo"));
            ResultSet rsEnc  = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral_encaminhamento(filter), pEnc, conn);
            while (rsEnc.next()){
                RelatorioGeralEncaminhamento rge = new RelatorioGeralEncaminhamento();
                rge.setOrigem(rsEnc.getString("origem"));
                rge.setDestino(rsEnc.getString("destino"));
                rge.setTitulo(rsEnc.getString("titulo"));
                rge.setDataEncaminhamento(rsEnc.getDate("data_encaminhamento"));
                rge.setProfissional(rsEnc.getString("profissional"));
                relatorioGeral.getEncaminhamentos().add(rge);
            }

            //Atividade Coletiva
            Map<String, Object> pAti = new HashMap<>();
            pAti.put("usu_codigo", relatorioGeral.getUsuCodigo());
            pAti.put("uni_codigo", rs.getInt("uni_codigo"));
            ResultSet rsAti  = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral_atividade(filter), pAti, conn);
            while (rsAti.next()){
                RelatorioGeralAtividade rgat = new RelatorioGeralAtividade();
                rgat.setCodigoGrupo(rsAti.getLong("codigo"));
                rgat.setGrupo(rsAti.getString("grupo"));
                rgat.setUnidade(rsAti.getString("unidade"));

                //Encontros
                Map<String, Object> pAtiEnc = new HashMap<>();
                pAtiEnc.put("gru_codigo", rgat.getCodigoGrupo());
                pAtiEnc.put("usu_codigo", relatorioGeral.getUsuCodigo());
                ResultSet rsAtiEnc  = Util.subResultSet(ResumoGeralScript.getSqlRelatorioGeral_atividade_encontro(), pAtiEnc, conn);
                while (rsAtiEnc.next()){
                    RelatorioGeralAtividadeEncontro rgae = new RelatorioGeralAtividadeEncontro();
                    rgae.setTitulo(rsAtiEnc.getString("titulo"));
                    rgae.setDescricao(rsAtiEnc.getString("descricao"));
                    rgae.setDataInicio(rsAtiEnc.getTimestamp("dt_inicio"));
                    rgae.setDataFinal(rsAtiEnc.getTimestamp("dt_final"));
                    rgae.setPresenca(rsAtiEnc.getString("asaeh_presenca"));
                    rgat.getEncontros().add(rgae);
                }
                relatorioGeral.getAtividades().add(rgat);
            }

            data.add(relatorioGeral);
        }

        conn.close();
        String titulo = "Relatório Geral";
        String filename = filter.getTipo().toLowerCase();
        creator = new JasperCreator(SistemaEnum.SOCIAL, filename, titulo, data, filter.getTp_rel());
        creator.setFiltro(FormatFilters.filterResumoGeral(filter));
        creator.gerarPdf();
    }

}
