package br.com.elotech.saude.scripts;


import br.com.elotech.saude.model.filters.PacientesFaixaSexoFilter;
import br.com.elotech.util.Util;


public abstract class PacientesFaixaSexoScript {

    private static StringBuilder builder;

    public static String getSql(PacientesFaixaSexoFilter filter) {
        builder = new StringBuilder();
        StringBuilder sbFaixa = new StringBuilder();
        StringBuilder sbCaseFaixa = new StringBuilder();
        if(filter.getFaixaEtaria() != null){
            if(filter.getFaixaEtaria().size() > 0){
                sbCaseFaixa.append(" CASE ");
                for (int i = 0; i < filter.getFaixaEtaria().size(); i++){
                    String f = filter.getFaixaEtaria().get(i);
                    if(i == 0){
                        sbFaixa.append(" AND (EXTRACT(YEAR FROM age(usu.usu_datanasc)) ".concat(f));
                    }else{
                        sbFaixa.append(" OR EXTRACT(YEAR FROM age(usu.usu_datanasc)) ".concat(f));
                    }
                    if(filter.getSexo()!= null){
                       sbCaseFaixa.append("  WHEN (usu_sexo = :sexo AND ")
                                  .append(" EXTRACT(YEAR FROM age(usu.usu_datanasc)) ")
                                  .append(f)
                                  .append(") THEN '")
                                  .append(Util.getSexo(filter.getSexo()))
                                  .append(" - ")
                                  .append(Util.getLabelCase(f));
                    }else{
                       sbCaseFaixa.append("  WHEN (usu_sexo = 'M' AND ")
                                  .append(" EXTRACT(YEAR FROM age(usu.usu_datanasc)) ")
                                  .append(f)
                                  .append(") THEN '")
                                  .append(" MASCULINO ")
                                  .append(" - ")
                                  .append(Util.getLabelCase(f));
                        sbCaseFaixa.append("  WHEN (usu_sexo = 'F' AND ")
                                .append(" EXTRACT(YEAR FROM age(usu.usu_datanasc)) ")
                                .append(f)
                                .append(") THEN '")
                                .append(" FEMININO ")
                                .append(" - ")
                                .append(Util.getLabelCase(f));
                    }

                }
                sbCaseFaixa.append(" ELSE 'Não informado'")
                           .append(" END AS faixa,");
                sbFaixa.append(") ");
            }
        }else{
            sbCaseFaixa.append(" CASE ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) < 1) THEN 'MASCULINO - Menores que 1 ano' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 1) THEN 'MASCULINO - Iguais a 1 ano' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 2) THEN 'MASCULINO - Iguais a 2 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 3) THEN 'MASCULINO - Iguais a 3 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 4) THEN 'MASCULINO - Iguais a 4 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 5 AND 9) THEN 'MASCULINO - Entre 5 e 9 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 10 AND 14) THEN 'MASCULINO - Entre 10 e 14 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 15 AND 19) THEN 'MASCULINO - Entre 15 e 19 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 20 AND 24) THEN 'MASCULINO - Entre 20 e 24 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 25 AND 29) THEN 'MASCULINO - Entre 25 e 29 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 30 AND 34) THEN 'MASCULINO - Entre 30 e 34 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 35 AND 39) THEN 'MASCULINO - Entre 35 e 39 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 40 AND 44) THEN 'MASCULINO - Entre 40 e 44 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 45 AND 49) THEN 'MASCULINO - Entre 45 e 49 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 50 AND 54) THEN 'MASCULINO - Entre 50 e 54 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 55 AND 59) THEN 'MASCULINO - Entre 55 e 59 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 60 AND 64) THEN 'MASCULINO - Entre 60 e 64 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 65 AND 69) THEN 'MASCULINO - Entre 65 e 69 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 70 AND 74) THEN 'MASCULINO - Entre 70 e 74 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 75 AND 79) THEN 'MASCULINO - Entre 75 e 79 anos' ")
                       .append(" WHEN (usu_sexo ='M' AND EXTRACT(YEAR FROM age(usu_datanasc)) > 80) THEN 'MASCULINO - Maior que 80 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) < 1) THEN 'FEMININO - Menores que 1 ano' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 1) THEN 'FEMININO - Iguais a 1 ano' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 2) THEN 'FEMININO - Iguais a 2 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 3) THEN 'FEMININO - Iguais a 3 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) = 4) THEN 'FEMININO - Iguais a 4 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 5 AND 9) THEN 'FEMININO - Entre 5 e 9 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 10 AND 14) THEN 'FEMININO - Entre 10 e 14 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 15 AND 19) THEN 'FEMININO - Entre 15 e 19 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 20 AND 24) THEN 'FEMININO - Entre 20 e 24 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 25 AND 29) THEN 'FEMININO - Entre 25 e 29 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 30 AND 34) THEN 'FEMININO - Entre 30 e 34 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 35 AND 39) THEN 'FEMININO - Entre 35 e 39 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 40 AND 44) THEN 'FEMININO - Entre 40 e 44 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 45 AND 49) THEN 'FEMININO - Entre 45 e 49 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 50 AND 54) THEN 'FEMININO - Entre 50 e 54 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 55 AND 59) THEN 'FEMININO - Entre 55 e 59 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 60 AND 64) THEN 'FEMININO - Entre 60 e 64 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 65 AND 69) THEN 'FEMININO - Entre 65 e 69 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 70 AND 74) THEN 'FEMININO - Entre 70 e 74 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) BETWEEN 75 AND 79) THEN 'FEMININO - Entre 75 e 79 anos' ")
                       .append(" WHEN (usu_sexo ='F' AND EXTRACT(YEAR FROM age(usu_datanasc)) > 80) THEN 'FEMININO - Maior que 80 anos' ")
                       .append(" ELSE 'Não informado'")
                       .append(" END AS faixa,");

        }

        builder.append("SELECT")
               .append(sbCaseFaixa)
               .append(" usu.usu_nome AS cidadao,")
               .append(" usu.usu_prontuario AS prontuario,")
               .append(" usu.usu_datanasc   AS datanascimento,")
               .append(" EXTRACT(YEAR FROM AGE(usu.usu_datanasc)) AS idade,")
               .append(" usu.usu_cartao_sus        AS cartaoSus,")
               .append(" COALESCE(uni.uni_desc, 'Não informado') AS unidade");
        if(filter.getAgrUsr()){
          builder.append(" ,COALESCE(usr.usr_nome, 'Não informado') AS profissional,")
                 .append(" COALESCE(teq.nu_ine, 'Não informado') AS ineEquipe,")
                 .append(" COALESCE(teq.no_equipe, 'Não informado') AS nomeEquipe");
        }
          builder.append(" FROM usuario usu")
                 .append(" LEFT JOIN unidade uni on uni.uni_codigo = usu.uni_codigo")
                 .append(" LEFT JOIN microarea mic on mic.mic_codigo = usu.usu_microarea")
                 .append(" LEFT JOIN usuarios usr on usr.usr_codigo = mic.mic_responsavel")
                 .append(" LEFT JOIN tb_equipe as teq on mic.co_seq_equipe = teq.co_seq_equipe")
                 .append(" WHERE 1=1 AND usu.usu_mudanca_territorio = 'f'")
                 .append(sbFaixa);
        if(filter.getSexo()!= null){
            builder.append(" AND usu.usu_sexo = :sexo");
        }
        if(filter.getUnidade()!= null){
            builder.append(" AND uni.uni_codigo = :unidade");
        }
        if(filter.getEquipe()!= null){
            builder.append(" AND teq.nu_ine = :equipe");
        }
        if(filter.getProfissional()!= null){
            builder.append(" AND usr.usr_codigo = :profissional");
        }
        if(filter.getAgrUsr()){
          builder.append(" ORDER BY uni.uni_desc, teq.nu_ine, usr.usr_nome,  faixa, usu.usu_nome");
        } else{
          builder.append(" ORDER BY uni.uni_desc, faixa, usu.usu_nome");
        }

     return builder.toString();
    }
}

