package br.com.elotech.social.scripts;

import br.com.elotech.enuns.TipoRelEnum;
import br.com.elotech.social.model.filters.AtendimentoBasicoFilter;

public class AtendimentoBasicoScript {

    public static String getSql(AtendimentoBasicoFilter filter) {
      StringBuilder sb = new StringBuilder(" SELECT")
                .append("     upper(uni.uni_desc)                              AS unidade,")
                .append("     upper(COALESCE(asam.asam_nome, 'NÃO INFORMADO')) AS motivo,")
                .append("     upper(asat.asat_nome)                            AS tipo_atendimento,");
        if (filter.getTpRel().equals(TipoRelEnum.SINTETICO)) {
            sb.append(" COUNT(asat.asat_nome)                          AS qtd_atendimentos");
        } else {
            sb.append("     upper(usu.usu_nome)                        AS cidadao,")
                    .append("     upper(usr.usr_nome)                        AS profissional,")
                    .append("     asab.asab_data                             AS data");
        }
        sb.append("   FROM as_atendimento_basicocras asab")
                .append("   LEFT JOIN as_atendimento_basicocras_motivo asabm ON asabm.asab_codigo = asab.asab_codigo")
                .append("   LEFT JOIN as_atendimento_motivo asam  ON asabm.asam_codigo = asam.asam_codigo")
                .append("   JOIN as_atendimento_tipo asat  ON asab.asat_codigo = asat.asat_codigo")
                .append("   JOIN unidade uni ON asab.uni_codigo  = uni.uni_codigo")
                .append("   JOIN usuarios usr ON usr.usr_codigo   = asab.usr_codigo")
                .append("   JOIN usuario usu ON usu.usu_codigo   = asab.usu_codigo")
                .append("   WHERE CAST(asab.asab_data AS DATE) BETWEEN :dtInicial AND :dtFinal")
                .append("   AND uni.uni_codigo = :unidade");

        if (filter.getProfissional() != null) {
            sb.append("  AND usr.usr_codigo = :profissional");
        }

        if (filter.getMotivo() != null) {
            sb.append("  AND asam.asam_codigo = :motivo");
        }

        if (filter.getTpRel().equals(TipoRelEnum.SINTETICO)) {
            sb.append("  GROUP BY 1,2,3");
        }
        sb.append("  ORDER BY 1,2,3,4;");
        return sb.toString();
    }

}
