package br.com.elotech.saude.scripts;

import br.com.elotech.saude.model.filters.transporte.ViagensFilter;

public abstract class ViagensScript {

  private static StringBuilder sb;

  public static String getSqlSintetico(ViagensFilter filter){
    sb = new StringBuilder();
    sb.append(" SELECT via.via_codigo       AS codigo,")
      .append("        via.via_data         AS data,")
      .append("       (SELECT count(ua.usu_codigo)")
      .append("         FROM usuario_acompanhante ua")
      .append("           JOIN viagem_usuario v ON ua.viausu_codigo = v.viausu_codigo")
      .append("                                     AND v.via_codigo = via.via_codigo")
      .append("         WHERE ua.viausu_codigo = v.viausu_codigo) AS qtdeAcompanhantes,")
      .append("       (SELECT count(usu_codigo) FROM viagem_usuario vu WHERE vu.via_codigo = via.via_codigo) AS qtdePacientes,")
      .append("       usr.usr_nome         AS motorista,")
      .append("       vei.vei_descricao    AS veiculo,")
      .append("       cid1.cid_nome        AS origem,")
      .append("       cid2.cid_nome        AS destino")
      .append(" FROM viagem AS via")
      .append(" INNER JOIN usuarios AS usr ON usr.usr_codigo = via.usr_codigo")
      .append(" INNER JOIN veiculo AS vei ON vei.vei_codigo = via.vei_codigo")
      .append(" LEFT JOIN cidade AS cid1 ON cid1.cid_codigo = via.cid_codigo_origem")
      .append(" LEFT JOIN cidade AS cid2 ON cid2.cid_codigo = via.cid_codigo_destino")
      .append(" LEFT JOIN viagem_usuario AS vu ON vu.via_codigo = via.via_codigo")
      .append(" WHERE via.via_data BETWEEN :dtInicial AND :dtFinal");
    if(filter.getVeiculo()!=null){
      sb.append(" AND vei.vei_codigo = :veiculo");
    }
    if(filter.getPaciente()!=null){
      sb.append(" AND vu.usu_codigo = :paciente");
    }
    if(filter.getMunicipio()!=null){
      sb.append(" AND via.cid_codigo_destino = :municipio");
    }
    sb.append(" GROUP BY via.via_codigo, via_data, usr_nome, vei_descricao, origem,")
      .append("   destino");
    if(filter.getAgrupamento().contains("M")){
      sb.append(" ORDER BY cid2.cid_nome, via.via_data");
    } else {
      sb.append(" ORDER BY via.via_data");
    }

    return sb.toString();
  }

  public static String getSqlAnalitico(ViagensFilter filter){
    sb = new StringBuilder();
    sb.append("SELECT DISTINCT")
      .append("    via.via_codigo             AS codigo,")
      .append("    vu.viausu_codigo           AS viausu_codigo,")
      .append("    via.via_data               AS data,")
      .append("    usr.usr_nome               AS motorista,")
      .append("    vei.vei_descricao          AS veiculo,")
      .append("    cid1.cid_nome              AS origem,")
      .append("    cid2.cid_nome              AS destino,")
      .append("    usu.usu_nome               AS paciente,")
      .append("    usu.usu_cartao_sus         AS cns,")
      .append("    dom.dom_telefone           AS telefone,")
      .append("    usu.usu_celular            AS celular,")
      .append("    local_emb.loc_descricao    AS local_emb,")
      .append("    loc_emb.tvl_hora           AS hora_emb,")
      .append("    local_desemb.loc_descricao AS local_desemb,")
      .append("    loc_desemb.tvl_hora        AS hora_desemb,")
      .append("    local_atend.loc_descricao  AS local_atend,")
      .append("    vu.hora_atendimento        AS hora_atend,")
      .append("    vu.viausu_observacao       AS obs")
      .append(" FROM viagem_usuario AS vu")
      .append("   JOIN viagem AS via  ON via.via_codigo = vu.via_codigo")
      .append("   JOIN usuario AS usu ON usu.usu_codigo = vu.usu_codigo")
      .append("   LEFT JOIN domicilio AS dom ON dom.dom_codigo = usu.dom_codigo")
      .append("   LEFT JOIN cidade AS cid1 ON via.cid_codigo_origem = cid1.cid_codigo")
      .append("   LEFT JOIN cidade AS cid2 ON via.cid_codigo_destino = cid2.cid_codigo")
      .append("   JOIN veiculo AS vei ON via.vei_codigo = vei.vei_codigo")
      .append("   JOIN usuarios     AS usr  ON via.usr_codigo = usr.usr_codigo")
      .append("   LEFT JOIN transporte_viagem_locais AS loc_emb")
      .append("      ON vu.loc_codigo_embarque = loc_emb.loc_codigo AND loc_emb.tvl_tipo = 'E' AND vu.via_codigo = loc_emb.via_codigo")
      .append("   LEFT JOIN transporte_viagem_locais AS loc_desemb")
      .append("      ON vu.loc_codigo_desembarque = loc_desemb.loc_codigo AND loc_desemb.tvl_tipo = 'D' AND vu.via_codigo = loc_desemb.via_codigo")
      .append("   LEFT JOIN transporte_locais AS local_emb ON local_emb.loc_codigo = loc_emb.loc_codigo")
      .append("   LEFT JOIN transporte_locais AS local_desemb ON local_desemb.loc_codigo = loc_desemb.loc_codigo")
      .append("   LEFT JOIN transporte_locais AS local_atend ON local_atend.loc_codigo = vu.loc_codigo_atendimento")
      .append(" WHERE via.via_data BETWEEN :dtInicial AND :dtFinal");
    if(filter.getVeiculo()!=null){
      sb.append(" AND vei.vei_codigo = :veiculo");
    }
    if(filter.getPaciente()!=null){
      sb.append(" AND vu.usu_codigo = :paciente");
    }
    if(filter.getMunicipio()!=null){
      sb.append(" AND via.cid_codigo_destino = :municipio");
    }
    if(filter.getAgrupamento().contains("M")){
      sb.append(" ORDER BY cid2.cid_nome, via.via_data");
    } else {
      sb.append(" ORDER BY via.via_data");
    }

    return sb.toString();
  }

}
