package br.com.elotech.websaude.integracao.esus.controller;

import br.com.elotech.websaude.integracao.esus.model.BD;
import br.com.elotech.websaude.integracao.esus.model.BancoCadastroIndividual;
import br.com.elotech.websaude.integracao.esus.model.EsusHistoricoItens;
import br.com.elotech.websaude.integracao.esus.model.enums.TipoDadoSerializado;
import br.com.elotech.websaude.integracao.esus.util.Compactador;
import br.ufsc.esus.cadastroindividual.CadastroIndividualTransport;
import br.ufsc.esus.condicoesdesaude.CondicoesDeSaudeTransport;
import br.ufsc.esus.dadoinstalacao.DadoInstalacaoTransport;
import br.ufsc.esus.dadotransporte.DadoTransporteTransportCadastroIndividualXml;
import br.ufsc.esus.emsituacaoderua.EmSituacaoDeRuaTransport;
import br.ufsc.esus.identificacaousuariocidadao.IdentificacaoUsuarioCidadaoTransport;
import br.ufsc.esus.informacoessociodemograficas.InformacoesSocioDemograficasTransport;
import br.ufsc.esus.saidacidadaocadastro.SaidaCidadaoCadastroTransport;
import br.ufsc.esus.unicalotacaoheader.UnicaLotacaoHeaderTransport;
import br.ufsc.esus.versao.VersaoTransport;
import org.apache.commons.lang3.StringUtils;

import javax.xml.bind.JAXBContext;
import javax.xml.bind.JAXBElement;
import javax.xml.bind.JAXBException;
import javax.xml.bind.Marshaller;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.time.LocalDate;
import java.time.Period;

import static br.com.elotech.websaude.integracao.esus.util.DataConvert.dateToEpoch;

public class CadastroIndividual extends BD {

  public static int idade(final LocalDate aniversario, final LocalDate row) {
    final Period periodo = Period.between(aniversario, row);
    return periodo.getYears();
  }

  public void executeMain(int eehCodigo, DadoInstalacaoTransport remetenteOriginadora)
    throws SQLException, JAXBException, IOException {
    BancoCadastroIndividual bdCadastroIndividual = new BancoCadastroIndividual();
    EsusHistoricoItens bdEsusHistoricoItens = new EsusHistoricoItens();

    ResultSet dadosCadastroIndividual = bdCadastroIndividual.getDados();

    while (dadosCadastroIndividual.next()) {
      CadastroIndividual thriftCadastroIndividual;
      thriftCadastroIndividual = new CadastroIndividual();
      String uuid = thriftCadastroIndividual.getGUID();
      String uuidFichaOri = dadosCadastroIndividual.getString("uuid_ficha_ori") != null
        ? dadosCadastroIndividual.getString("uuid_ficha_ori")
        : uuid;
      CadastroIndividualTransport fichaMaster = cadastroIndividualThrift(uuid, dadosCadastroIndividual,
        uuidFichaOri);
      DadoTransporteTransportCadastroIndividualXml arrayEnvio = montaArrayEnvioDto(fichaMaster, uuid,
        dadosCadastroIndividual, eehCodigo, remetenteOriginadora);
      zipWriter(arrayEnvio, uuid);
      bdEsusHistoricoItens.registratHistoricoItens(eehCodigo, uuid, 1);
      bdCadastroIndividual.atualizaStatus(uuid, dadosCadastroIndividual.getInt("eci_codigo"), uuidFichaOri);
    }

  }

  public CadastroIndividualTransport cadastroIndividualThrift(String uuid, ResultSet row, String uuidFichaOri)
    throws SQLException {

    UnicaLotacaoHeaderTransport unicaLotacaoHeader = headerCdsCadastroThrift(row);
    IdentificacaoUsuarioCidadaoTransport dadosCidadao = identificacaoUsuarioCidadaoThrift(row);
    InformacoesSocioDemograficasTransport informacoesSocioDemograficas = informacoesSocioDemograficasThrift(row);
    CondicoesDeSaudeTransport condicoesSaude = condicoesDeSaudeThrift(row);
    SaidaCidadaoCadastroTransport saidaCidadaoCadastro = saidaCidadaoCadastroThrift(row);
    EmSituacaoDeRuaTransport emSituacaoDeRua = emSituacaoDeRuaThrift(row);

    CadastroIndividualTransport fichaMaster = new CadastroIndividualTransport();

    fichaMaster.setHeaderTransport(unicaLotacaoHeader);
    fichaMaster.setStatusTermoRecusaCadastroIndividualAtencaoBasica(row.getBoolean("eci_usu_recusa"));
    fichaMaster.setIdentificacaoUsuarioCidadao(dadosCidadao);
    if (!row.getBoolean("eci_usu_recusa")) {
      fichaMaster.setInformacoesSocioDemograficas(informacoesSocioDemograficas);
      fichaMaster.setCondicoesDeSaude(condicoesSaude);
      fichaMaster.setEmSituacaoDeRua(emSituacaoDeRua);
      fichaMaster.setSaidaCidadaoCadastro(saidaCidadaoCadastro);
    }
    fichaMaster.setTpCdsOrigem(3);
    fichaMaster.setUuid(uuid);
    fichaMaster.setUuidFichaOriginadora(uuidFichaOri);
    fichaMaster.setFichaAtualizada(Boolean.FALSE.equals(uuid.equals(uuidFichaOri)));

    return fichaMaster;
  }

  public UnicaLotacaoHeaderTransport headerCdsCadastroThrift(ResultSet row) throws SQLException {

    UnicaLotacaoHeaderTransport headerCadDomiciliar = new UnicaLotacaoHeaderTransport();

    headerCadDomiciliar.setProfissionalCNS(
      (validaCnsBanco(row.getString("eci_usr_profissional_cns")) ? row.getString("eci_usr_profissional_cns") : null));
    headerCadDomiciliar.setCboCodigo2002(row.getString("eci_usr_cbo"));
    headerCadDomiciliar.setCodigoIbgeMunicipio(row.getString("eci_usr_codigo_ibge"));
    headerCadDomiciliar.setCnes(StringUtils.leftPad(row.getString("eci_usr_cnes"), 7, "0"));
    headerCadDomiciliar.setIne(row.getString("eci_usr_ine"));
    headerCadDomiciliar.setDataAtendimento(dateToEpoch(row.getDate("eci_usr_dtatendimento")));

    return headerCadDomiciliar;
  }

  public InformacoesSocioDemograficasTransport informacoesSocioDemograficasThrift(ResultSet row) throws SQLException {
    BancoCadastroIndividual bdCadastroIndividual = new BancoCadastroIndividual();
    InformacoesSocioDemograficasTransport infoDemo = new InformacoesSocioDemograficasTransport();
    int usuCodigo = row.getInt("usu_codigo");
    if (!row.getBoolean("eci_usu_st_responsavel_familiar")
      && (row.getLong("eci_usu_parentesco_resp") != 0L)) {
      infoDemo.setRelacaoParentescoCidadao(row.getLong("eci_usu_parentesco_resp"));
    }
    if (row.getString("eci_usu_ocupacao") != null) {
      infoDemo.setOcupacaoCodigoCbo2002(row.getString("eci_usu_ocupacao"));
    }
    if (row.getString("eci_usu_escola") != null) {
      infoDemo.setStatusFrequentaEscola(row.getBoolean("eci_usu_escola"));
    }
    if (row.getLong("eci_usu_curso_mais_elevado") != 0L) {
      infoDemo.setGrauInstrucaoCidadao(row.getLong("eci_usu_curso_mais_elevado"));
    }
    if (row.getLong("eci_usu_mercado_trabalho") != 0L) {
      infoDemo.setSituacaoMercadoTrabalhoCidadao(row.getLong("eci_usu_mercado_trabalho"));
    }
    ResultSet responsaveis = bdCadastroIndividual.getResponsavelPorCrianca(usuCodigo);
    while (responsaveis.next()) {
      infoDemo.getResponsavelPorCrianca().add(responsaveis.getLong("eci_pergunta_detalhe"));
    }
    if (row.getString("eci_usu_freq_cuidador_trad") != null) {
      infoDemo.setStatusFrequentaBenzedeira(row.getBoolean("eci_usu_freq_cuidador_trad"));
    }
    if (row.getString("eci_usu_grupo_comunitario") != null) {
      infoDemo.setStatusParticipaGrupoComunitario(row.getBoolean("eci_usu_grupo_comunitario"));
    }
    if (row.getString("eci_usu_plano_saude") != null) {
      infoDemo.setStatusPossuiPlanoSaudePrivado(row.getBoolean("eci_usu_plano_saude"));
    }
    if (row.getString("eci_usu_povo_comunidade_trad") != null) {
      infoDemo.setStatusMembroPovoComunidadeTradicional(row.getBoolean("eci_usu_povo_comunidade_trad"));
    }
    if (row.getBoolean("eci_usu_povo_comunidade_trad")
      && (row.getBoolean("eci_usu_povo_comunidade_trad"))) {
      infoDemo.setPovoComunidadeTradicional(row.getString("eci_usu_povo_comunidade_trad_nome"));
    }
    if (row.getString("eci_usu_orientacao_sexual") != null) {
      infoDemo.setStatusDesejaInformarOrientacaoSexual(row.getBoolean("eci_usu_orientacao_sexual"));
    }
    if (row.getBoolean("eci_usu_orientacao_sexual")
      && (row.getBoolean("eci_usu_orientacao_sexual"))) {
      infoDemo.setOrientacaoSexualCidadao(row.getLong("eci_usu_orientacao_sexual_nome"));
    }
    if (row.getString("eci_usu_identidade_genero") != null) {
      infoDemo.setStatusDesejaInformarIdentidadeGenero(row.getBoolean("eci_usu_identidade_genero"));
    }
    if (row.getBoolean("eci_usu_identidade_genero")) {
      infoDemo.setIdentidadeGeneroCidadao(row.getLong("eci_usu_identidade_genero_nome"));
    }
    if (row.getString("eci_usu_deficiencia") != null) {
      infoDemo.setStatusTemAlgumaDeficiencia(row.getBoolean("eci_usu_deficiencia"));
    }
    if (row.getBoolean("eci_usu_deficiencia")) {
      ResultSet deficiencias = bdCadastroIndividual.getDeficienciasCidadao(usuCodigo);
      while (deficiencias.next()) {
        infoDemo.getDeficienciasCidadao().add(deficiencias.getLong("eci_pergunta_detalhe"));
      }

    }
    return infoDemo;
  }

  public CondicoesDeSaudeTransport condicoesDeSaudeThrift(ResultSet row) throws SQLException {
    BancoCadastroIndividual bdCadastroIndividual = new BancoCadastroIndividual();
    CondicoesDeSaudeTransport condicao = new CondicoesDeSaudeTransport();
    int usuCodigo = row.getInt("usu_codigo");
    if (row.getDate("eci_usu_dtnascimento") != null && row.getDate("eci_usr_dtatendimento") != null)
      if (row.getString("usu_sexo").equals("F") &&
        idade(row.getDate("eci_usu_dtnascimento").toLocalDate(), row.getDate("eci_usr_dtatendimento").toLocalDate())
          <= 60 &&
        idade(row.getDate("eci_usu_dtnascimento").toLocalDate(), row.getDate("eci_usr_dtatendimento").toLocalDate())
          >= 9) {

        if (row.getString("usu_esta_gestante") != null) {
          condicao.setStatusEhGestante(row.getBoolean("usu_esta_gestante"));
        }
        if (row.getBoolean("usu_esta_gestante")) {
          condicao.setMaternidadeDeReferencia(row.getString("eci_usu_maternidade_ref"));
        }
      }
    if (Long.valueOf(row.getLong("eci_usu_peso")) != 0L) {
      condicao.setSituacaoPeso(row.getLong("eci_usu_peso"));
    }
    if (row.getString("eci_usu_fumante") != null) {
      condicao.setStatusEhFumante(row.getBoolean("eci_usu_fumante"));
    }
    if (row.getString("eci_usu_alcool") != null) {
      condicao.setStatusEhDependenteAlcool(row.getBoolean("eci_usu_alcool"));
    }
    if (row.getString("eci_usu_drogas") != null) {
      condicao.setStatusEhDependenteOutrasDrogas(row.getBoolean("eci_usu_drogas"));
    }
    if (row.getString("usu_tem_hipertensao") != null) {
      condicao.setStatusTemHipertensaoArterial(row.getBoolean("usu_tem_hipertensao"));
    }
    if (row.getString("usu_tem_diabete") != null) {
      condicao.setStatusTemDiabetes(row.getBoolean("usu_tem_diabete"));
    }
    if (row.getString("eci_usu_avc_derrame") != null) {
      condicao.setStatusTeveAvcDerrame(row.getBoolean("eci_usu_avc_derrame"));
    }
    if (row.getString("eci_usu_infarto") != null) {
      condicao.setStatusTeveInfarto(row.getBoolean("eci_usu_infarto"));
    }
    if (row.getString("eci_usu_doenca_cardiaca") != null) {
      condicao.setStatusTeveDoencaCardiaca(row.getBoolean("eci_usu_doenca_cardiaca"));
    }
    if (row.getBoolean("eci_usu_doenca_cardiaca")) {
      ResultSet cardiaca = bdCadastroIndividual.getDoencaCardiaca(usuCodigo);
      while (cardiaca.next()) {
        condicao.getDoencaCardiaca().add(cardiaca.getLong("eci_pergunta_detalhe"));
      }
    }
    if (row.getString("eci_usu_problema_rins") != null) {
      condicao.setStatusTemTeveDoencasRins(row.getBoolean("eci_usu_problema_rins"));
    }
    if (row.getBoolean("eci_usu_problema_rins")) {
      ResultSet rins = bdCadastroIndividual.getDoencaRins(usuCodigo);
      while (rins.next()) {
        condicao.getDoencaRins().add(rins.getLong("eci_pergunta_detalhe"));
      }
    }
    if (row.getString("eci_usu_doenca_respiratoria") != null) {
      condicao.setStatusTemDoencaRespiratoria(row.getBoolean("eci_usu_doenca_respiratoria"));
    }
    if (row.getBoolean("eci_usu_doenca_respiratoria")) {
      ResultSet respiratoria = bdCadastroIndividual.getDoencaRespiratoria(usuCodigo);
      while (respiratoria.next()) {
        condicao.getDoencaRespiratoria().add(respiratoria.getLong("eci_pergunta_detalhe"));
      }
    }
    if (row.getString("eci_usu_hanseniase") != null) {
      condicao.setStatusTemHanseniase(row.getBoolean("eci_usu_hanseniase"));
    }
    if (row.getString("eci_usu_tuberculose") != null) {
      condicao.setStatusTemTuberculose(row.getBoolean("eci_usu_tuberculose"));
    }
    if (row.getString("eci_usu_cancer") != null) {
      condicao.setStatusTemTeveCancer(row.getBoolean("eci_usu_cancer"));
    }
    if (row.getString("eci_usu_internacao_dose_meses") != null) {
      condicao.setStatusTeveInternadoEm12Meses(row.getBoolean("eci_usu_internacao_dose_meses"));
    }
    if (row.getBoolean("eci_usu_internacao_dose_meses")) {
      condicao.setDescricaoCausaInternacaoEm12Meses(row.getString("eci_usu_internacao_dose_meses_causa"));
    }
    if (row.getString("eci_usu_problema_saude_mental") != null) {
      condicao.setStatusDiagnosticoMental(row.getBoolean("eci_usu_problema_saude_mental"));
    }
    if (row.getString("eci_usu_acamado") != null) {
      condicao.setStatusEstaAcamado(row.getBoolean("eci_usu_acamado"));
    }
    if (row.getString("eci_usu_domiciliado") != null) {
      condicao.setStatusEstaDomiciliado(row.getBoolean("eci_usu_domiciliado"));
    }
    if (row.getString("eci_usu_plantas_medicinais") != null) {
      condicao.setStatusUsaPlantaMedicinais(row.getBoolean("eci_usu_plantas_medicinais"));
    }
    if (row.getBoolean("eci_usu_plantas_medicinais")) {
      condicao.setDescricaoPlantasMedicinaisUsadas(row.getString("eci_usu_plantas_medicinais_nome"));
    }
    if (row.getString("eci_usu_praticas_integrat_complem") != null) {
      condicao
        .setStatusUsaOutrasPraticasIntegrativasOuComplementares(row.getBoolean("eci_usu_praticas_integrat_complem"));
    }
    if (row.getString("eci_usu_condicao_saude1") != null) {
      condicao.setDescricaoOutraCondicao1(row.getString("eci_usu_condicao_saude1"));
    }
    if (row.getString("eci_usu_condicao_saude2") != null) {
      condicao.setDescricaoOutraCondicao2(row.getString("eci_usu_condicao_saude2"));
    }
    if (row.getString("eci_usu_condicao_saude3") != null) {
      condicao.setDescricaoOutraCondicao3(row.getString("eci_usu_condicao_saude3"));
    }
    return condicao;
  }

  public EmSituacaoDeRuaTransport emSituacaoDeRuaThrift(ResultSet row) throws SQLException {
    EmSituacaoDeRuaTransport situacao = new EmSituacaoDeRuaTransport();
    situacao.setStatusSituacaoRua(row.getBoolean("eci_usu_sit_rua"));
    if (row.getBoolean("eci_usu_sit_rua")) {
      BancoCadastroIndividual bdCadastroIndividual = new BancoCadastroIndividual();
      int usuCodigo = row.getInt("usu_codigo");
      if (row.getLong("eci_usu_situacao_rua_tempo") != 0L) {
        situacao.setTempoSituacaoRua(row.getLong("eci_usu_situacao_rua_tempo"));
      }
      if (row.getString("eci_usu_recebe_beneficio") != null) {
        situacao.setStatusRecebeBeneficio(row.getBoolean("eci_usu_recebe_beneficio"));
      }
      if (row.getString("eci_usu_referencia_familiar") != null) {
        situacao.setStatusPossuiReferenciaFamiliar(row.getBoolean("eci_usu_referencia_familiar"));
      }
      if (row.getLong("eci_usu_vezes_alimenta_dia") != 0L) {
        situacao.setQuantidadeAlimentacoesAoDiaSituacaoRua(row.getLong("eci_usu_vezes_alimenta_dia"));
      }
      ResultSet origem = bdCadastroIndividual.getOrigemAlimentoSituacaoRua(usuCodigo);
      while (origem.next()) {
        situacao.getOrigemAlimentoSituacaoRua().add(origem.getLong("eci_pergunta_detalhe"));
      }
      if (row.getString("eci_usu_acompanhado_intituicao") != null) {
        situacao.setStatusAcompanhadoPorOutraInstituicao(row.getBoolean("eci_usu_acompanhado_intituicao"));
      }
      if (row.getBoolean("eci_usu_acompanhado_intituicao")) {
        situacao.setOutraInstituicaoQueAcompanha(row.getString("eci_usu_acompanhado_intituicao_nome"));
      }
      if (row.getString("eci_usu_vista_familiar_frequencia") != null) {
        situacao.setStatusVisitaFamiliarFrequentemente(row.getBoolean("eci_usu_vista_familiar_frequencia"));
      }
      if (row.getBoolean("eci_usu_vista_familiar_frequencia")) {
        situacao.setGrauParentescoFamiliarFrequentado(row.getString("eci_usu_vista_familiar_grau"));
      }
      if (row.getString("eci_usu_acesso_higiene_pessoal") != null) {
        situacao.setStatusTemAcessoHigienePessoalSituacaoRua(row.getBoolean("eci_usu_acesso_higiene_pessoal"));
      }
      if (row.getBoolean("eci_usu_acesso_higiene_pessoal")) {
        ResultSet higiene = bdCadastroIndividual.getHigienePessoalSituacaoRua(usuCodigo);
        while (higiene.next()) {
          situacao.getHigienePessoalSituacaoRua().add(higiene.getLong("eci_pergunta_detalhe"));
        }
      }
    }
    return situacao;
  }

  public SaidaCidadaoCadastroTransport saidaCidadaoCadastroThrift(ResultSet row) throws SQLException {

    SaidaCidadaoCadastroTransport saida = new SaidaCidadaoCadastroTransport();

    if (row.getBoolean("eci_usu_obito")) {
      saida.setMotivoSaidaCidadao(135L);
      saida.setDataObito(dateToEpoch(row.getDate("eci_usu_dt_obito")));
      saida.setNumeroDO(row.getString("eci_usu_numero_do"));
    }
    if (row.getBoolean("eci_usu_mudanca_territorio")) {
      saida.setMotivoSaidaCidadao(136L);
    }

    return saida;
  }

  public IdentificacaoUsuarioCidadaoTransport identificacaoUsuarioCidadaoThrift(ResultSet row) throws SQLException {

    IdentificacaoUsuarioCidadaoTransport iuct = new IdentificacaoUsuarioCidadaoTransport();
    if (row.getString("eci_usu_nacionalidade").equals("1 L")) {
      iuct.setCodigoIbgeMunicipioNascimento(
        (row.getString("eci_usu_nacionalidade").equals("1 L") ? row.getString("eci_usu_codigo_ibge") : null));
    }
    iuct.setDataNascimentoCidadao(dateToEpoch(row.getDate("eci_usu_dtnascimento")));
    iuct.setNacionalidadeCidadao(Long.valueOf(row.getString("eci_usu_nacionalidade").replace(" L", "")));
    if (!row.getString("eci_usu_nacionalidade").equals("2 L")) {
      iuct.setPaisNascimento(
        (row.getString("eci_usu_nacionalidade").equals("1 L")
          ? 31
          : nacionalidadeProcess(row))
      );
    }
    if (row.getString("eci_usu_nome_social") != null) {
      iuct.setNomeSocial(row.getString("eci_usu_nome_social"));
    }
    if (row.getString("eci_usu_nome") != null) {

      iuct.setNomeCidadao(row.getString("eci_usu_nome"));
    }
    iuct.setNomeMaeCidadao(row.getString("eci_usu_mae").trim());
    if (row.getString("eci_usu_pai") != null) {
      iuct.setNomePaiCidadao(row.getString("eci_usu_pai"));
    } else {
      iuct.setDesconheceNomePai(true);
    }
    if (row.getString("eci_usu_nacionalidade").equals("2 L")) {
      iuct.setPortariaNaturalizacao(
        (row.getString("eci_usu_nacionalidade").equals("2 L") ? row.getString("nr_portaria_naturalizacao") : null));
    }
    if (row.getString("eci_usu_nacionalidade").equals("2 L")) {
      iuct.setDtNaturalizacao(
        (row.getString("eci_usu_nacionalidade").equals("2 L") && row.getDate("dt_naturalizacao") != null ?
          dateToEpoch(row.getDate("dt_naturalizacao")) :
          null));
    }
    if (row.getString("eci_usu_nacionalidade").equals("3 L")) {
      iuct.setDtEntradaBrasil((row.getString("eci_usu_nacionalidade").equals("3 L") ?
        dateToEpoch(row.getDate("usu_dt_entrada_pais")) :
        null));
    }
    if ((validaCnsBanco(row.getString("eci_usu_cns")))) {
      iuct.setCnsCidadao(row.getString("eci_usu_cns"));
    } else if (validaCpf(row.getString("eci_cpf"))) {
      iuct.setCpfCidadao(row.getString("eci_cpf"));
    }
    iuct.setRacaCorCidadao(Long.valueOf(row.getString("eci_usu_raca").replace(" L", "")));
    iuct.setSexoCidadao(Long.valueOf(row.getString("eci_usu_sexo").replace(" L", "")));
    iuct.setStatusEhResponsavel(row.getBoolean("eci_usu_st_responsavel_familiar"));
    if (Boolean.FALSE.equals(iuct.getStatusEhResponsavel())) {
      iuct.setCnsResponsavelFamiliar(row.getString("eci_cns_responsavel_familiar"));
      if (iuct.getCnsResponsavelFamiliar() == null && validaCpf(row.getString("eci_cpf_responsavel_familiar"))) {
        iuct.setCpfResponsavelFamiliar(row.getString("eci_cpf_responsavel_familiar"));
      }
    }
    if (row.getString("eci_usu_raca").equals("5 L")) {
      iuct.setEtnia((row.getString("eci_usu_raca").equals("5 L") ? row.getLong("etn_codigo") : null));
    }
    iuct.setMicroArea(row.getString("eci_usu_microarea"));
    if (row.getString("eci_usu_microarea_fa") != null) {
      iuct.setStForaArea(row.getBoolean("eci_usu_microarea_fa"));
    }
    iuct.setNumeroNisPisPasep(row.getString("eci_usu_pis_pasep"));
    if (row.getString("eci_usu_celular") != null) {
      String telefoneCelular = row.getString("eci_usu_celular").replaceAll("\\D", "");
      iuct.setTelefoneCelular(telefoneCelular);
    }
    iuct.setEmailCidadao(row.getString("eci_usu_email"));
    return iuct;
  }

  protected Long nacionalidadeProcess(ResultSet row) throws SQLException {
    if (row.getString("eci_usu_nacionalidade").equals("3 L")) {
      return row.getLong("epa_codigo");
    }
    return null;
  }

  public void zipWriter(DadoTransporteTransportCadastroIndividualXml xmlText, String uuid)
    throws JAXBException, IOException {
    String arquivo = uuid + ".esus.xml";
    br.ufsc.esus.dadotransporte.ObjectFactoryCadastroindividual factoryCadastroIndividual = new br.ufsc.esus.dadotransporte.ObjectFactoryCadastroindividual();
    JAXBContext context;
    context = JAXBContext.newInstance(br.ufsc.esus.dadotransporte.ObjectFactoryCadastroindividual.class);
    JAXBElement<DadoTransporteTransportCadastroIndividualXml> element
      = factoryCadastroIndividual.createDadoTransporteTransportCadastroIndividualXml(xmlText);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty("jaxb.formatted.output", Boolean.TRUE);
    marshaller.marshal(element, new FileWriter("arqs/" + arquivo));
    Compactador.ARQUIVOS.add(arquivo);

  }

  public DadoTransporteTransportCadastroIndividualXml montaArrayEnvioDto(
    CadastroIndividualTransport fichaMasterSerializado, String uuid, ResultSet row, int eehCodigo,
    DadoInstalacaoTransport remetenteOriginadora)
    throws SQLException {
    remetenteOriginadora.setUuidInstalacao(uuid);

    VersaoTransport arrayVersao = new VersaoTransport();
    arrayVersao.setMajor(3);
    arrayVersao.setMinor(2);
    arrayVersao.setRevision(4);

    DadoTransporteTransportCadastroIndividualXml dadoTransporteTransportXml = new DadoTransporteTransportCadastroIndividualXml();
    dadoTransporteTransportXml.setUuidDadoSerializado(uuid);
    dadoTransporteTransportXml
      .setTipoDadoSerializado(TipoDadoSerializado.CADASTROINDIVIDUAL.getValue());
    dadoTransporteTransportXml.setCnesDadoSerializado(StringUtils.leftPad(row.getString("eci_usr_cnes"), 7, "0"));
    dadoTransporteTransportXml.setNumLote(eehCodigo);
    dadoTransporteTransportXml.setCodIbge(row.getString("eci_usr_codigo_ibge"));
    dadoTransporteTransportXml.setIneDadoSerializado(row.getString("eci_usr_ine"));
    dadoTransporteTransportXml.setRemetente(remetenteOriginadora);
    dadoTransporteTransportXml.setOriginadora(remetenteOriginadora);
    dadoTransporteTransportXml.setVersao(arrayVersao);
    dadoTransporteTransportXml.setCadastroIndividualTransport(fichaMasterSerializado);

    return dadoTransporteTransportXml;
  }

}
