/*
 * 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.util.Ibge;
import br.com.elotech.websaude.integracao.cnes.ui.EstabelecimentoXML;

import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

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

/**
 *
 * @author elotech
 */
public class UnidadeController {

    PreparedStatement pstmt;

    public List<Estabelecimento> dadosGeraisEstabelecimentos(List<Estabelecimento> estabelecimentos, List<Estabelecimento> listaPrestadores) throws SQLException {
        Map<Estabelecimento, Integer> mapaPrestador = new HashMap<>();
        TbEquipeController equipes = new TbEquipeController();
            equipes.inativarEquipes();
            UnidadeComplexidadeController unidadeComplexidade = new UnidadeComplexidadeController();
            unidadeComplexidade.inativaUnidadeComplexidade();
            UsuariosEquipeController usuariosEquipeController = new UsuariosEquipeController();
            usuariosEquipeController.excluirTodosCnes();
            // SSAUDE-194 - Remove temporariamente a inativação da microarea
            // MicroareaController microareaController = new MicroareaController();
            // microareaController.inativarTodos();
            inativarUnidades();

        for (Estabelecimento e : estabelecimentos) {
            if (!listaPrestadores.contains(e)) {

                int uniCodigo = getUnidadeByCnes(e.cnes.trim());
                String sql = "";

                if (uniCodigo > 0) { //ALTERACAO
                    sql = "UPDATE unidade SET "
                            + "cnes_unidade_id=?, "
                            + "uni_cnes=?, "
                            + "cnes_cnpj_mant=?, "
                            + "cnes_pfpj_ind=?, "
                            + "cnes_nivel_dep=?, "
                            + "cnes_r_social=?, "
                            + "uni_desc=?, "
                            + "uni_endereco=?, "
                            + "uni_numero=?, "
                            + "cnes_complement=?, "
                            + "cnes_bairro=?, "
                            + "uni_cep=?, "
                            + "cnes_reg_saude=?, "
                            + "cnes_micro_reg=?, "
                            + "cnes_dist_sanit=?, "
                            + "cnes_dist_admin=?, "
                            + "cnes_telefone=?, "
                            + "cnes_fax=?, "
                            + "cnes_e_mail=?, "
                            + "cnes_cpf=?, "
                            + "uni_cnpj=?, "
                            + "cnes_cod_ativ=?, "
                            + "cnes_cod_client=?, "
                            + "cnes_num_alvara=?, "
                            + "cnes_data_exped=?, "
                            + "cnes_ind_orgexp=?, "
                            + "cnes_tp_unid_id=?, "
                            + "cnes_cod_turnat=?, "
                            + "cnes_sigestgest=?, "
                            + "cnes_codmungest=?, "
                            + "cnes_statusmov=?, "
                            + "cnes_data_atu=?, "
                            + "cnes_usuario=?, "
                            + "cnes_d_tercsih=?, uni_cnes_importacao=true,cnes_ativo='A',uni_codigo_ibge=?,uni_as='false'"
                            + " WHERE uni_codigo=" + uniCodigo;

                } else { //INSERCAO
                    sql = "INSERT INTO unidade("
                            + "cnes_unidade_id, "
                            + "uni_cnes, "
                            + "cnes_cnpj_mant, "
                            + "cnes_pfpj_ind, "
                            + "cnes_nivel_dep, "
                            + "cnes_r_social, "
                            + "uni_desc, "
                            + "uni_endereco, "
                            + "uni_numero, "
                            + "cnes_complement, "
                            + "cnes_bairro, "
                            + "uni_cep, "
                            + "cnes_reg_saude, "
                            + "cnes_micro_reg, "
                            + "cnes_dist_sanit, "
                            + "cnes_dist_admin, "
                            + "cnes_telefone, "
                            + "cnes_fax, "
                            + "cnes_e_mail, "
                            + "cnes_cpf, "
                            + "uni_cnpj, "
                            + "cnes_cod_ativ, "
                            + "cnes_cod_client, "
                            + "cnes_num_alvara, "
                            + "cnes_data_exped, "
                            + "cnes_ind_orgexp, "
                            + "cnes_tp_unid_id, "
                            + "cnes_cod_turnat, "
                            + "cnes_sigestgest, "
                            + "cnes_codmungest, "
                            + "cnes_statusmov, "
                            + "cnes_data_atu, "
                            + "cnes_usuario, "
                            + "cnes_d_tercsih,uni_cnes_importacao,cnes_ativo,uni_tipo,uni_codigo_ibge,uni_as) VALUES( "
                            + "?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,true,'A','U',?,'false')";
                }
                pstmt = CONN.prepareStatement(sql);

                pstmt.setString(1, tratar(e.unidadeId, 31));
                pstmt.setInt(2, tratarInt(e.cnes));
                pstmt.setString(3, tratar(e.cnpjMant, 14));
                pstmt.setString(4, tratar(e.pfpjInd, 1));
                pstmt.setString(5, tratar(e.nivelDep, 1));
                pstmt.setString(6, tratar(e.rSocial, 60));
                pstmt.setString(7, tratar(e.nomeFanta, 60));
                pstmt.setString(8, e.logradouro);
                pstmt.setString(9, tratar(e.numero, 5));
                pstmt.setString(10, tratar(e.complement, 60));
                pstmt.setString(11, tratar(e.bairro, 60));
                pstmt.setString(12, tratar(e.codCep, 9));
                pstmt.setString(13, tratar(e.regSaude, 4));
                pstmt.setString(14, tratar(e.microReg, 6));
                pstmt.setString(15, tratar(e.distSanit, 4));
                pstmt.setString(16, tratar(e.distAdmin, 4));
                pstmt.setString(17, tratar(e.telefone, 40));
                pstmt.setString(18, tratar(e.fax, 60));
                pstmt.setString(19, tratar(e.eMail, 60));
                pstmt.setString(20, tratar(e.cpf, 11));
                pstmt.setString(21, tratar(e.cnpj, 25));
                pstmt.setString(22, tratar(e.codAtiv, 2));
                pstmt.setString(23, tratar(e.codClient, 2));
                pstmt.setString(24, tratar(e.numAlvara, 60));
                pstmt.setDate(25, tratarDate(e.dataExped));
                pstmt.setString(26, tratar(e.indOrgexp, 2));
                pstmt.setString(27, tratar(e.tpUnidId, 2));
                pstmt.setString(28, tratar(e.codTurnat, 2));
                pstmt.setString(29, tratar(e.sigestgest, 2));
                pstmt.setString(30, tratar(e.codmungest, 7));
                pstmt.setString(31, tratar(e.statusmov, 1));
                pstmt.setDate(32, tratarDate(e.dataAtu));
                pstmt.setString(33, tratar(e.usuario, 12));
                pstmt.setString(34, tratar(e.dTercsih, 1));
                pstmt.setString(35, Ibge.valida(tratar(e.codmungest, 7)));

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

            int uni_codigo = getUnidadeByCnes(e.cnes.trim());
            equipes.cadastraEquipe(e, uni_codigo);
            //unidadeComplexidade.cadastrarUnidadeComplexidade(e,uni_codigo);
        }

        MedicoController mc = new MedicoController();
        mc.prestadorDeServico(listaPrestadores);

        return listaPrestadores;
    }

    private void inativarUnidades() throws SQLException {

        CONN.prepareStatement("UPDATE unidade SET cnes_ativo = 'I' WHERE uni_cnes_importador_ignorar=false AND uni_as <> true").executeUpdate();

    }

    public int getUnidadeByCnes(String cnes) throws SQLException {
        int result = 0;
        PreparedStatement pstmt = CONN.prepareStatement("SELECT uni_codigo FROM unidade WHERE uni_cnes="+cnes.trim()+" AND uni_cnes_importador_ignorar=false ORDER BY uni_codigo DESC LIMIT 1");
        ResultSet rs = pstmt.executeQuery();
        if (rs.next()) {
          return rs.getInt("uni_codigo");
        }
        return result;
    }

    public List<EstabelecimentoXML> dadosEstabelecimentoXML(List<Estabelecimento> estabelecimentos) throws SQLException {
        List<EstabelecimentoXML> lista = new ArrayList();
        EstabelecimentoXML exml;
        for (Estabelecimento e : estabelecimentos) {
            pstmt = CONN.prepareStatement("SELECT uni_codigo FROM unidade WHERE uni_cnes=? AND uni_cnes_importador_ignorar=false AND uni_cnes_importacao=false AND cnes_ativo is not null ORDER BY cnes_ativo,uni_codigo DESC LIMIT 1");
            pstmt.setInt(1, Integer.valueOf(e.cnes));
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                exml = new EstabelecimentoXML();
                exml.setE(e);
                exml.setNomeFantasia(e.nomeFanta);
                exml.setRazaoSocial(e.rSocial);
                exml.setCnes(e.cnes);
                exml.setCnpj(e.cnpj);
                exml.setEhPrestador(false);
                lista.add(exml);
            } else {
                pstmt = CONN.prepareStatement("SELECT med_codigo FROM medico WHERE cnes=? AND (med_cnes_importacao = false OR med_cnes_importacao is null)");
                pstmt.setInt(1, Integer.valueOf(e.cnes));
                ResultSet rs1 = pstmt.executeQuery();
                if (rs.next()) {
                    exml = new EstabelecimentoXML();
                    exml.setE(e);
                    exml.setNomeFantasia(e.nomeFanta);
                    exml.setRazaoSocial(e.rSocial);
                    exml.setCnpj(e.cnpj);
                    exml.setCnes(e.cnes);
                    exml.setEhPrestador(true);

                    lista.add(exml);
                }else{
                    pstmt = CONN.prepareStatement("SELECT uni_codigo FROM unidade WHERE uni_cnes=? AND uni_cnes_importador_ignorar=false AND uni_cnes_importacao=true");
                    pstmt.setInt(1, Integer.valueOf(e.cnes));
                    ResultSet rs2 = pstmt.executeQuery();
                    if(rs2.next()) {
                    }else{
                        pstmt = CONN.prepareStatement("SELECT med_codigo,med_cnes_importacao FROM medico WHERE cnes=?");
                        pstmt.setInt(1, Integer.valueOf(e.cnes));
                        ResultSet rs3 = pstmt.executeQuery();
                        if(rs3.next()) {
                            if(!rs3.getBoolean("med_cnes_importacao")) {
                                exml = new EstabelecimentoXML();
                                exml.setE(e);
                                exml.setNomeFantasia(e.nomeFanta);
                                exml.setRazaoSocial(e.rSocial);
                                exml.setCnpj(e.cnpj);
                                exml.setCnes(e.cnes);
                                exml.setEhPrestador(true);

                                lista.add(exml);
                            }
                        }else{
                            pstmt = CONN.prepareStatement("SELECT count(*) FROM medico WHERE cnes="+e.cnes+" AND med_cnes_importacao<>true");
                            rs3 = pstmt.executeQuery();
                            if(rs3.next()) {
                                exml = new EstabelecimentoXML();
                                exml.setE(e);
                                exml.setNomeFantasia(e.nomeFanta);
                                exml.setRazaoSocial(e.rSocial);
                                exml.setCnpj(e.cnpj);
                                exml.setCnes(e.cnes.trim());
                                exml.setEhPrestador(true);
                                lista.add(exml);
                            }
                        }
                    }
                }
            }
        }
        return lista;
    }

    public List<Estabelecimento> dadosPrestadoresExistentes(List<Estabelecimento> estabelecimentos) throws SQLException {
        List<Estabelecimento> est = new ArrayList();
        for (Estabelecimento e : estabelecimentos) {
            pstmt = CONN.prepareStatement("SELECT med.med_codigo FROM medico med WHERE med.cnes=? AND med.med_cnes_importacao=true");
            pstmt.setInt(1, Integer.valueOf(e.cnes));
            ResultSet rs = pstmt.executeQuery();
            if (rs.next()) {
                if(rs.getInt("med_codigo")>0) {
                    est.add(e);
                }
            }
        }
        return est;
    }

}
