package br.com.elotech.saude.scripts;

import br.com.elotech.saude.model.filters.psf.PrescricaoMedicamentosFilter;

public abstract class PrescricaoMedicamentosScript {

  private static StringBuilder sb;

  public static String getSql(PrescricaoMedicamentosFilter filter) {
    sb = new StringBuilder();
    sb.append(" SELECT usu.usu_nome AS nomePaciente, "
      + "              CASE usu.usu_tem_diabete "
      + "                WHEN 'TRUE' THEN 'SIM' "
      + "                ELSE 'NÃO' END AS diabete, "
      + "              CASE usu.risco_diabetes "
      + "                WHEN 'A' THEN 'ALTO' "
      + "                WHEN 'M' THEN 'MÉDIO' "
      + "                WHEN 'B' THEN 'BAIXO' "
      + "                ELSE 'Não estratificado' END AS riscoDiabete, "
      + "              CASE usu.usu_tem_hipertensao "
      + "                WHEN 'TRUE' THEN 'SIM' "
      + "                ELSE 'NÃO' END AS hipertensao, "
      + "              CASE usu.risco_hipertensao "
      + "                WHEN 'A' THEN 'ALTO' "
      + "                WHEN 'M' THEN 'MÉDIO' "
      + "                WHEN 'B' THEN 'BAIXO' "
      + "                ELSE 'Não estratificado' END AS riscoHipertensao, "
      + "              pro.pro_nome AS nomeMedicacao, "
      + "              irec.irec_quantidade AS qtdMedicacaoPrescrita, "
      + "              rec.rec_data AS dataReceita, "
      + "              usr.usr_nome AS profissionalQuePrescreveu "
      + "         FROM receita rec "
      + "         JOIN atendimento ate ON rec.ate_codigo = ate.ate_codigo "
      + "         JOIN usuario usu ON ate.usu_codigo = usu.usu_codigo "
      + "         JOIN itemreceita irec ON irec.rec_codigo = rec.rec_codigo "
      + "         JOIN produto pro ON pro.pro_codigo = irec.pro_codigo "
      + "         JOIN usuarios usr ON ate.med_codigo = usr.usr_codigo "
      + "         LEFT JOIN usuarios_equipe ueq ON ueq.usr_codigo = usr.usr_codigo "
      + "         LEFT JOIN tb_equipe eq ON ueq.co_equipe = eq.co_seq_equipe "
      + "         JOIN unidade uni ON ate.uni_codigo = uni.uni_codigo "
      + "        WHERE 1 = 1 ");

    if (filter.getUnidade() != null) {
      sb.append(" AND uni.uni_codigo = :unidade");
    }

    if (filter.getEquipe() != null) {
      sb.append(" AND eq.nu_ine = :equipe");
    }

    if (filter.getDiabetico() != null && filter.getHipertenso() == null) {
      sb.append(" AND usu.usu_tem_diabete = true");
    } else if (filter.getDiabetico() == null && filter.getHipertenso() != null) {
      sb.append(" AND usu.usu_tem_hipertensao = true");
    } else if (filter.getDiabetico() != null && filter.getHipertenso() != null) {
      sb.append(" AND (usu.usu_tem_diabete = true OR usu.usu_tem_hipertensao = true)");
    }

    if (filter.getDataFinal() != null && filter.getDataFinal() != null) {
      sb.append(" AND rec.rec_data between :dataInicial AND :dataFinal ");
    }

    if (filter.getRiscoDiabetico() != null && filter.getRiscoHipertenso() == null) {
      sb.append(" AND usu.risco_diabetes = :riscoDiabetico");
    } else if (filter.getRiscoDiabetico() == null && filter.getRiscoHipertenso() != null) {
      sb.append(" AND usu.risco_hipertensao = :riscoHipertenso");
    } else if (filter.getRiscoDiabetico() != null && filter.getRiscoHipertenso() != null) {
      sb.append(" AND (usu.risco_hipertensao = :riscoHipertenso OR usu.risco_hipertensao = :riscoHipertenso)");
    }

    sb.append(" ORDER BY usu.usu_nome, rec.rec_data DESC, pro.pro_nome");

    return sb.toString();
  }
}
