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.EsusHistoricoItens;
import br.com.elotech.websaude.integracao.esus.model.enums.TipoDadoSerializado;
import br.com.elotech.websaude.integracao.esus.util.Compactador;
import br.com.elotech.websaude.integracao.esus.util.DataConvert;
import br.ufsc.esus.dadoinstalacao.DadoInstalacaoTransport;
import br.ufsc.esus.dadotransporte.DadoTransporteTransportVisitaDomiciliarXml;
import br.ufsc.esus.fichavisitadomiciliarchild.FichaVisitaDomiciliarChildTransport;
import br.ufsc.esus.fichavisitadomiciliarmaster.FichaVisitaDomiciliarMasterTransport;
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.util.ArrayList;
import java.util.List;

public class VisitaDomiciliar extends BD {

  public void executeMain(int eehCodigo, DadoInstalacaoTransport remetenteOriginadora)
    throws SQLException, JAXBException, IOException {
    br.com.elotech.websaude.integracao.esus.model.VisitaDomiciliar bdVisitaDomiciliar = new br.com.elotech.websaude.integracao.esus.model.VisitaDomiciliar();
    EsusHistoricoItens bdEsusHistoricoItens = new EsusHistoricoItens();
    ResultSet dadosVisitaDomiciliar = bdVisitaDomiciliar.getDadosVisitaDomiciliar();
    while (dadosVisitaDomiciliar.next()) {
      VisitaDomiciliar visitaDomiciliar = new VisitaDomiciliar();
      String uuid = visitaDomiciliar.getGUID();

      FichaVisitaDomiciliarMasterTransport fichaMaster = visitaDomiciliarMasterThrift(uuid, dadosVisitaDomiciliar);
      DadoTransporteTransportVisitaDomiciliarXml arrayEnvio = montaArrayEnvioDto(fichaMaster, uuid,
        dadosVisitaDomiciliar, eehCodigo, remetenteOriginadora);

      zipWriter(arrayEnvio, uuid);
      bdEsusHistoricoItens.registratHistoricoItens(eehCodigo, uuid, 5);

      bdVisitaDomiciliar.atualizaStatus(uuid, dadosVisitaDomiciliar.getInt("ate_codigo"));
    }
    dadosVisitaDomiciliar.close();
  }

  public void zipWriter(DadoTransporteTransportVisitaDomiciliarXml xmlText, String uuid)
    throws JAXBException, IOException {
    // Define nome do arquivo
    String arquivo = uuid + ".esus.xml";
    br.ufsc.esus.dadotransporte.ObjectFactoryVisitaDomiciliar factoryCadastroIndividual = new br.ufsc.esus.dadotransporte.ObjectFactoryVisitaDomiciliar();

    JAXBContext context;
    context = JAXBContext.newInstance(br.ufsc.esus.dadotransporte.ObjectFactoryVisitaDomiciliar.class);
    JAXBElement<DadoTransporteTransportVisitaDomiciliarXml> element
      = factoryCadastroIndividual.createDadoTransporteTransportVisitaDomiciliarXml(xmlText);
    Marshaller marshaller = context.createMarshaller();
    marshaller.setProperty("jaxb.formatted.output", Boolean.TRUE);
    marshaller.marshal(element, new FileWriter("arqs/" + arquivo));
    Compactador.ARQUIVOS.add(arquivo);
  }

  public FichaVisitaDomiciliarMasterTransport visitaDomiciliarMasterThrift(String uuid, ResultSet row)
    throws SQLException {
    UnicaLotacaoHeaderTransport dadosHeaderTransport = headerTransport(row);
    FichaVisitaDomiciliarChildTransport dadosFichaVisitaDomiciliar = fichaVisitaDomiciliarChildThrift(row);
    FichaVisitaDomiciliarMasterTransport array = new FichaVisitaDomiciliarMasterTransport();
    array.setUuidFicha(uuid);
    array.setTpCdsOrigem(3);
    array.setHeaderTransport(dadosHeaderTransport);

    array.getVisitasDomiciliares().add(dadosFichaVisitaDomiciliar);

    return array;
  }

  public UnicaLotacaoHeaderTransport headerTransport(ResultSet row) throws SQLException {

    UnicaLotacaoHeaderTransport array = new UnicaLotacaoHeaderTransport();
    array.setProfissionalCNS(
      (validaCnsBanco(row.getString("esv_profissional_cns")) ? row.getString("esv_profissional_cns").trim() : null));
    array.setCboCodigo2002(row.getString("esv_cbo_codigo_2002"));
    array.setCnes(StringUtils.leftPad(row.getString("esv_cnes"), 7, "0"));
    array.setIne(row.getString("nu_ine"));
    array.setDataAtendimento(DataConvert.dateToEpoch(row.getDate("esv_dtatendimento")));
    array.setCodigoIbgeMunicipio(row.getString("esv_codigo_ibge_mun"));
    return array;
  }

  public FichaVisitaDomiciliarChildTransport fichaVisitaDomiciliarChildThrift(ResultSet row) throws SQLException {

    FichaVisitaDomiciliarChildTransport array = new FichaVisitaDomiciliarChildTransport();
    array.setNumProntuario(row.getString("esv_num_prontuario"));
    if ((validaCnsBanco(row.getString("esv_usu_cns")))) {
      array.setCnsCidadao(row.getString("esv_usu_cns"));
    } else if (validaCpf(row.getString("usu_cpf"))) {
      array.setCpfCidadao(row.getString("usu_cpf"));
    }
    array.setDtNascimento(DataConvert.dateToEpoch(row.getDate("esv_usu_datanasc")));
    array.setSexo(Long.valueOf(row.getString("esv_usu_sexo").replace(" L", "")));
    array.setStatusVisitaCompartilhadaOutroProfissional(row.getBoolean("st_visita_compartilhada"));
    array.setDesfecho(Long.valueOf(row.getString("esv_desfecho").replace(" L", "")));
    array.setTurno((long) row.getInt("turno"));
    array.setTipoDeImovel((long) row.getInt("no_cds_tipo_imovel"));

    List<Long> tipoImovel = new ArrayList<>();
    tipoImovel.add(2L);
    tipoImovel.add(3L);
    tipoImovel.add(4L);
    tipoImovel.add(5L);
    tipoImovel.add(6L);
    tipoImovel.add(12L);
    if (!tipoImovel.contains(array.getTipoDeImovel())) {
      if (row.getDouble("vd_altura") > 0) {
        array.setAlturaAcompanhamentoNutricional(row.getDouble("vd_altura"));
      }
      if (row.getDouble("vd_peso") > 0) {
        array.setPesoAcompanhamentoNutricional(row.getDouble("vd_peso"));
      }
    }

    if (row.getString("usu_microarea_fa") != null) {
      if (row.getString("usu_microarea_fa").contains("t")) {
        array.setStForaArea(true);
      } else {
        array.setStForaArea(false);
        array.setMicroArea(row.getString("usu_microarea"));
      }
    } else {
      array.setMicroArea(row.getString("usu_microarea"));
    }

    for (Long codigoVisita : motivoVisita(row.getInt("co_cds_visita_domiciliar"))) {

      if (array.getSexo() == 0 && (codigoVisita == 5 || codigoVisita == 6)) {
        continue;
      }
      array.getMotivosVisita().add(codigoVisita);
    }

    return array;
  }

  public List<Long> motivoVisita(int codVisita) throws SQLException {
    br.com.elotech.websaude.integracao.esus.model.VisitaDomiciliar bdVisitaDomiciliar = new br.com.elotech.websaude.integracao.esus.model.VisitaDomiciliar();
    ResultSet dadosVisitaDomiciliar = bdVisitaDomiciliar.getCodigosVisita(codVisita);
    List<Long> codsVis = new ArrayList<>();
    while (dadosVisitaDomiciliar.next()) {
      codsVis.add(dadosVisitaDomiciliar.getLong("co_cds_visita_dom_motivo"));
    }
    dadosVisitaDomiciliar.close();
    return codsVis;
  }

  private DadoTransporteTransportVisitaDomiciliarXml montaArrayEnvioDto(
    FichaVisitaDomiciliarMasterTransport dadosVisitaDomiciliarSerializado, 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);

    DadoTransporteTransportVisitaDomiciliarXml dadoTransporteTransportXml = new DadoTransporteTransportVisitaDomiciliarXml();
    dadoTransporteTransportXml.setUuidDadoSerializado(uuid);
    dadoTransporteTransportXml.setTipoDadoSerializado(TipoDadoSerializado.VISITADOMICILIAR.getValue());
    dadoTransporteTransportXml.setCnesDadoSerializado(StringUtils.leftPad(row.getString("esv_cnes"), 7, "0"));
    dadoTransporteTransportXml.setCodIbge(row.getString("esv_codigo_ibge_mun"));
    dadoTransporteTransportXml.setIneDadoSerializado(row.getString("esv_ine"));
    dadoTransporteTransportXml.setNumLote(eehCodigo);
    dadoTransporteTransportXml.setRemetente(remetenteOriginadora);
    dadoTransporteTransportXml.setOriginadora(remetenteOriginadora);
    dadoTransporteTransportXml.setVersao(arrayVersao);
    dadoTransporteTransportXml.setFichaVisitaDomiciliarMasterTransport(dadosVisitaDomiciliarSerializado);

    return dadoTransporteTransportXml;
  }

}
