/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.elotech.websaude.integracao.cnes.backend.controller;

import br.com.elotech.websaude.integracao.cnes.backend.model.Estabelecimento;
import br.com.elotech.websaude.integracao.cnes.backend.model.Profissional;
import br.com.elotech.websaude.integracao.cnes.backend.model.VinculoProfissional;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;

import static br.com.elotech.websaude.integracao.cnes.backend.model.dao.Conexao.*;

public class UsuariosController {

  private PreparedStatement pstmt;

  public void inativarUsuarios() throws SQLException {
    CONN.prepareStatement(
      "UPDATE usuarios SET usr_ativo='N',cnes_ativo='N' WHERE (usr_mestre = 'N' OR usr_mestre is null) AND "
        + "EXISTS(SELECT true FROM logon WHERE usr_codigo=id_login AND dt_entrada < (SELECT current_date - integer '60'))")
      .executeUpdate();
  }

  public void dadosProfissionais(List<Estabelecimento> estabelecimentos, List<Estabelecimento> listaPrestadores,
    int uniCodigo) throws SQLException {
    UnidadeUsuariosController unidadeUsuariosController = new UnidadeUsuariosController();

    MedicoEspecialidadeController medicoEspecialidadeController = new MedicoEspecialidadeController();
    EspecialidadeController especialidadeController = new EspecialidadeController();
    medicoEspecialidadeController.inativaTodos();
    UnidadeController uc = new UnidadeController();

    String sql = "";
    for (Estabelecimento e : estabelecimentos) {
      if (!listaPrestadores.contains(e)) {
        unidadeUsuariosController.apagaTudo(uc.getUnidadeByCnes(e.cnes));

        for (Profissional p : e.profissionais) {
          int usrCodigo = getUsuariosByCpf(p.cpfProf);

          if (usrCodigo == 0) {
            sql = "INSERT INTO usuarios("
              + "cnes_prof_id,"//1
              + "cnes_ativo,"//2
              + "usr_ativo,"//3
              + "usr_cpf,"//4
              + "cnes_pispasep,"//5
              + "usr_nome,"//6
              + "cnes_nome_mae,"//7
              + "cnes_data_nasc,"//8
              + "cnes_cod_mun,"//9
              + "cnes_sexo,"//10
              + "cnes_num_livro,"//11
              + "cnes_num_folha,"//12
              + "cnes_num_termo,"//13
              + "cnes_codorgemis,"//14
              + "cnes_data_emiss,"//15
              + "cnes_num_ident,"//16
              + "cnes_dtemiident,"//17
              + "cnes_data_entra,"//18
              + "cnes_ctps_numer,"//19
              + "cnes_serie,"//20
              + "cnes_sigestctps,"//21
              + "cnes_dtemisctps,"//22
              + "cnes_logradouro,"//23
              + "cnes_numero,"//24
              + "cnes_complement,"//25
              + "cnes_bairrodist,"//26
              + "cnes_cod_cep,"//27
              + "cnes_sigla_uf,"//28
              + "cnes_codescolar,"//29
              + "cnes_cod_certid,"//30
              + "cnes_ind_nacio,"//31
              + "cnes_nome_carto,"//32
              + "cnes_cod_banco,"//33
              + "cnes_nome_pais,"//34
              + "cnes_num_agenc,"//35
              + "cnes_conta_cc,"//36
              + "cnes_cod_cns,"//37
              + "cnes_d_tercsih,"//38
              + "cnes_status,"//39
              + "cnes_statusmov,"//40
              + "cnes_data_atu,"//41
              + "cnes_usuario,"//42
              + "cnes_cd_raca,"//43
              + "cnes_telefone,"//44
              + "cnes_nome_pai,"//45
              + "cnes_cd_tp_logr,"//46
              + "cnes_portaria,"//47
              + "cnes_dt_natur,"//48
              + "cnes_cd_pais,"//49
              + "usr_login,"//50
              + "usr_senha,"//51
              + "cnes_sigla_est"//52
              + ") VALUES(?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,md5(?),?)";//52
          } else {
            sql = "UPDATE usuarios SET "
              + "cnes_prof_id=?,"//1
              + "cnes_ativo=?,"//2
              + "usr_ativo=?,"//3
              + "usr_cpf=?,"//4
              + "cnes_pispasep=?,"//5
              + "usr_nome=?,"//6
              + "cnes_nome_mae=?,"//7
              + "cnes_data_nasc=?,"//8
              + "cnes_cod_mun=?,"//9
              + "cnes_sexo=?,"//10
              + "cnes_num_livro=?,"//11
              + "cnes_num_folha=?,"//12
              + "cnes_num_termo=?,"//13
              + "cnes_codorgemis=?,"//14
              + "cnes_data_emiss=?,"//15
              + "cnes_num_ident=?,"//16
              + "cnes_dtemiident=?,"//17
              + "cnes_data_entra=?,"//18
              + "cnes_ctps_numer=?,"//19
              + "cnes_serie=?,"//20
              + "cnes_sigestctps=?,"//21
              + "cnes_dtemisctps=?,"//22
              + "cnes_logradouro=?,"//23
              + "cnes_numero=?,"//24
              + "cnes_complement=?,"//25
              + "cnes_bairrodist=?,"//26
              + "cnes_cod_cep=?,"//27
              + "cnes_sigla_uf=?,"//28
              + "cnes_codescolar=?,"//29
              + "cnes_cod_certid=?,"//30
              + "cnes_ind_nacio=?,"//31
              + "cnes_nome_carto=?,"//32
              + "cnes_cod_banco=?,"//33
              + "cnes_nome_pais=?,"//34
              + "cnes_num_agenc=?,"//35
              + "cnes_conta_cc=?,"//36
              + "cnes_cod_cns=?,"//37
              + "cnes_d_tercsih=?,"//38
              + "cnes_status=?,"//39
              + "cnes_statusmov=?,"//40
              + "cnes_data_atu=?,"//41
              + "cnes_usuario=?,"//42
              + "cnes_cd_raca=?,"//43
              + "cnes_telefone=?,"//44
              + "cnes_nome_pai=?,"//45
              + "cnes_cd_tp_logr=?,"//46
              + "cnes_portaria=?,"//47
              + "cnes_dt_natur=?,"//48
              + "cnes_cd_pais=?"//49
              + "WHERE usr_codigo=" + usrCodigo; //50
          }

          pstmt = CONN.prepareStatement(sql);

          int count = 1;

          pstmt.setString(count++, tratar(p.profId, 16));
          pstmt.setString(count++, "S");
          pstmt.setString(count++, "S");
          pstmt.setString(count++, tratar(p.cpfProf, 15));
          pstmt.setString(count++, tratar(p.pispasep, 11));
          pstmt.setString(count++, tratar(p.nomeProf, 60));
          pstmt.setString(count++, tratar(p.nomeMae, 60));
          pstmt.setDate(count++, tratarDate(p.dataNasc));
          pstmt.setString(count++, tratar(p.codMun, 7));
          pstmt.setString(count++, tratar(p.sexo, 1));
          pstmt.setString(count++, tratar(p.numLivro, 8));
          pstmt.setString(count++, tratar(p.numFolha, 4));
          pstmt.setString(count++, tratar(p.numTermo, 8));
          pstmt.setString(count++, tratar(p.codorgemis, 2));
          pstmt.setDate(count++, tratarDate(p.dataEmiss));
          pstmt.setString(count++, tratar(p.numIdent, 14));
          pstmt.setDate(count++, tratarDate(p.dtemiident));
          pstmt.setDate(count++, tratarDate(p.dataEntra));
          pstmt.setString(count++, tratar(p.ctpsNumer, 7));
          pstmt.setString(count++, tratar(p.serie, 5));
          pstmt.setString(count++, tratar(p.sigestctps, 2));
          pstmt.setDate(count++, tratarDate(p.dtemisctps));
          pstmt.setString(count++, tratar(p.logradouro, 60));
          pstmt.setString(count++, tratar(p.numero, 10));
          pstmt.setString(count++, tratar(p.complement, 60));
          pstmt.setString(count++, tratar(p.bairrodist, 60));
          pstmt.setString(count++, tratar(p.codCep, 8));
          pstmt.setString(count++, tratar(p.sigleUf, 2));
          pstmt.setString(count++, tratar(p.codescolar, 2));
          pstmt.setString(count++, tratar(p.codCertid, 2));
          pstmt.setString(count++, tratar(p.indNacio, 1));
          pstmt.setString(count++, tratar(p.nomeCarto, 60));
          pstmt.setString(count++, tratar(p.codBanco, 3));
          pstmt.setString(count++, tratar(p.nomePais, 60));
          pstmt.setString(count++, tratar(p.numAgenc, 5));
          pstmt.setString(count++, tratar(p.contaCc, 14));
          pstmt.setString(count++, tratar(p.codCns, 60));
          pstmt.setString(count++, tratar(p.dTercsih, 1));
          pstmt.setString(count++, tratar(p.status, 1));
          pstmt.setString(count++, tratar(p.statusmov, 1));
          pstmt.setDate(count++, tratarDate(p.dataAtu));
          pstmt.setString(count++, tratar(p.usuario, 60));
          pstmt.setString(count++, tratar(p.cdRaca, 2));
          pstmt.setString(count++, tratar(p.telefone, 40));
          pstmt.setString(count++, tratar(p.nomePai, 60));
          pstmt.setString(count++, tratar(p.cdTpLogr, 3));
          pstmt.setString(count++, tratar(p.portaria, 16));
          pstmt.setDate(count++, tratarDate(p.dtNatur));
          pstmt.setString(count++, tratar(p.cdPais, 3));

          if (usrCodigo == 0) {
            pstmt.setString(count++, tratar(p.cpfProf, 225));
            pstmt.setString(count++, "123");
            pstmt.setString(count++, tratar(p.siglaEst, 2));
          }

          pstmt.executeUpdate();
          CONN.commit();

          usrCodigo = getUsuariosByCpf(p.cpfProf);

          unidadeUsuariosController.dadosUnidadeUsuarios(usrCodigo, uc.getUnidadeByCnes(e.cnes));
          int uniCodigo1 = medicoEspecialidadeController.inativarEspecialidades(usrCodigo, e.cnes);

          if (!listaPrestadores.contains(e)) {
            for (VinculoProfissional vp : p.vinculosProfissionais) {

              int espCodigo = especialidadeController.getEspecialidadePorCbo(vp.codCbo);
              int mesCodigo = medicoEspecialidadeController
                .confereCadEspecialidadePorMedico(usrCodigo, espCodigo, uniCodigo1);
              medicoEspecialidadeController.salvar(usrCodigo, espCodigo, vp.codCbo, mesCodigo, uniCodigo1, e.cnes);

              String conselho = "";
              if (vp.conselhoid != null) {
                if (vp.conselhoid.length() > 0)
                  conselho = ",con_codigo=" + vp.conselhoid;
                else
                  conselho = ",con_codigo=null";
              } else {
                conselho = ",con_codigo=null";
              }

              sql = "UPDATE usuarios SET  usr_tipo_medico ='" + setTipoMedico(vp) + "', "
                + "usr_num_conselho='" + vp.nRegistro + "'" + conselho + " WHERE usr_codigo=" + usrCodigo;

              CONN.prepareStatement(sql).executeUpdate();
              CONN.commit();
            }
          }
        }
      }
    }
  }

  public String setTipoMedico(VinculoProfissional vp) {
    final String COMUM = "C";
    final String MEDICO = "M";
    final String ENFERMEIRO = "E";
    final String FARMACEUTICO = "F";
    final String PSICOLOGO = "P";
    final String DENTISTA = "D";
    final String BIOQUIMICO = "B";
    final String ASSISTENTE_SOCIAL = "S";
    final String PEDAGOGO = "G";

    final String COD_MINISTERIO_DA_SAUDE = "83";
    final String COD_CONSELHO_NUTRICAO = "74";
    final String COD_CONSELHO_MEDICINA = "71";
    final String COD_CONSELHO_FISIOTERAPIA = "70";
    final String COD_CONSELHO_FONOAUDIOLOGIA = "17";
    final String COD_CONSELHO_ENFERMAGEM = "66";
    final String COD_CONSELHO_FARMACIA = "69";
    final String COD_CONSELHO_PSICOLOGIA = "77";
    final String COD_CONSELHO_ODONTOLOGIA = "75";
    final String COD_CONSELHO_QUIMICA = "78";
    final String COD_CONSELHO_BIOLOGIA = "18";
    final String COD_CONSELHO_BIOMEDICINA = "15";
    final String COD_CONSELHO_PEDAGOGIA = "24";

    final String COD_CBO_ASSISTENTE_SOCIAL = "251605";

    if (vp.conselhoid == null)
      return COMUM;

    if (vp.conselhoid.equals(COD_CONSELHO_FONOAUDIOLOGIA) ||
      vp.conselhoid.equals(COD_CONSELHO_FISIOTERAPIA) ||
      vp.conselhoid.equals(COD_CONSELHO_MEDICINA) ||
      vp.conselhoid.equals(COD_CONSELHO_NUTRICAO) ||
      vp.conselhoid.equals(COD_MINISTERIO_DA_SAUDE))
      return MEDICO;

    if (vp.conselhoid.equals(COD_CONSELHO_ENFERMAGEM))
      return ENFERMEIRO;

    if (vp.conselhoid.equals(COD_CONSELHO_FARMACIA))
      return FARMACEUTICO;

    if (vp.conselhoid.equals(COD_CONSELHO_PSICOLOGIA))
      return PSICOLOGO;

    if (vp.codCbo.equals(COD_CBO_ASSISTENTE_SOCIAL))
      return ASSISTENTE_SOCIAL;

    if (vp.conselhoid.equals(COD_CONSELHO_ODONTOLOGIA))
      return DENTISTA;

    if (vp.conselhoid.equals(COD_CONSELHO_BIOMEDICINA) || vp.conselhoid.equals(COD_CONSELHO_BIOLOGIA) || vp.conselhoid
      .equals(COD_CONSELHO_QUIMICA))
      return BIOQUIMICO;

    if (vp.conselhoid.equalsIgnoreCase(COD_CONSELHO_PEDAGOGIA))
      return PEDAGOGO;

    return COMUM;
  }

  public int getUsuariosByCpf(String cpf) throws SQLException {
    int result = 0;

    if (cpf != null) {
      if (cpf.length() > 0) {
        pstmt = CONN.prepareStatement("SELECT usr_codigo FROM usuarios WHERE usr_cpf=? OR usr_login=?");
        pstmt.setString(1, cpf);
        pstmt.setString(2, cpf);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
          result = rs.getInt("usr_codigo");
        }
      }
    }

    return result;
  }

  public int getUsuariosByProfId(String prof_id) throws SQLException {
    int result = 0;

    if (prof_id != null) {
      if (prof_id.length() > 0) {
        pstmt = CONN.prepareStatement("SELECT usr_codigo FROM usuarios WHERE cnes_prof_id=?");
        pstmt.setString(1, prof_id);
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
          result = rs.getInt("usr_codigo");
        }
      }
    }

    return result;
  }

}
