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.BancoFichaComplementar;
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.dadoinstalacao.DadoInstalacaoTransport;
import br.ufsc.esus.dadotransporte.DadoTransporteTransportFichaComplementarXml;
import br.ufsc.esus.fichacomplementarzikamicrocefalia.FichaComplementarZikaMicrocefaliaTransport;
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 static br.com.elotech.websaude.integracao.esus.util.DataConvert.dateToEpoch;

public class FichaComplementar extends BD {

  public void executeMain(int eehCodigo, DadoInstalacaoTransport remetenteOriginadora)
    throws SQLException, JAXBException, IOException {
    BancoFichaComplementar bdFichaComp = new BancoFichaComplementar();
    EsusHistoricoItens bdEsusHistoricoItens = new EsusHistoricoItens();
    ResultSet dadosComplementar = bdFichaComp.getDados();

    while (dadosComplementar.next()) {
      FichaComplementar complementar = new FichaComplementar();
      String uuid = complementar.getGUID();
      FichaComplementarZikaMicrocefaliaTransport ficha = fichaComplementarThrift(uuid, dadosComplementar);
      DadoTransporteTransportFichaComplementarXml arrayEnvio = montaArrayEnvioDto(ficha, uuid,
        dadosComplementar, eehCodigo, remetenteOriginadora);
      zipWriter(arrayEnvio, uuid);
      bdEsusHistoricoItens.registratHistoricoItens(eehCodigo, uuid, 13);
      bdFichaComp.atualizaStatus(uuid, dadosComplementar.getInt("codigo"));
    }
    dadosComplementar.close();
  }

  public void zipWriter(DadoTransporteTransportFichaComplementarXml xmlText, String uuid)
    throws JAXBException, IOException {
    String arquivo = uuid + ".esus.xml";
    br.ufsc.esus.dadotransporte.ObjectFactoryFichaComplementar factoryFichaComplementar = new br.ufsc.esus.dadotransporte.ObjectFactoryFichaComplementar();

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

  private FichaComplementarZikaMicrocefaliaTransport fichaComplementarThrift(String uuid, ResultSet row)
    throws SQLException {

    UnicaLotacaoHeaderTransport arrayUnica = montaArrayUnica(row);
    Integer origem = 3;

    FichaComplementarZikaMicrocefaliaTransport dadosFc = new FichaComplementarZikaMicrocefaliaTransport();

    dadosFc.setHeaderTransport(arrayUnica);
    dadosFc.setUuidFicha(uuid);
    dadosFc.setTpCdsOrigem(origem);
    dadosFc.setTurno(row.getLong("turno"));

    if ((validaCnsBanco(row.getString("cnsCidadao")))) {
      dadosFc.setCnsCidadao(row.getString("cnsCidadao"));
    } else if (validaCpf(row.getString("cpfCidadao"))) {
      dadosFc.setCpfCidadao(row.getString("cpfCidadao"));
    }

    if ((validaCnsBanco(row.getString("cnsResponsavelFamiliar")))) {
      dadosFc.setCnsResponsavelFamiliar(row.getString("cnsResponsavelFamiliar"));
    } else if (validaCpf(row.getString("cpfResponsavelFamiliar"))) {
      dadosFc.setCpfResponsavelFamiliar(row.getString("cpfResponsavelFamiliar"));
    }

    dadosFc.setDataRealizacaoTesteOlhinho(dateToEpoch(row.getDate("dataRealizacaoTesteOlhinho")));
    if (row.getLong("coResultadoTesteOlhinho") != 0L) {
      dadosFc.setCoResultadoTesteOlhinho(row.getLong("coResultadoTesteOlhinho"));
    }
    dadosFc.setDataRealizacaoExameFundoOlho(dateToEpoch(row.getDate("dataRealizacaoExameFundoOlho")));
    if (row.getLong("coResultadoExameFundoOlho") != 0L) {
      dadosFc.setCoResultadoExameFundoOlho(row.getLong("coResultadoExameFundoOlho"));
    }
    dadosFc.setDataRealizacaoTesteOrelhinha(dateToEpoch(row.getDate("dataRealizacaoTesteOrelhinha")));
    if (row.getLong("coResultadoTesteOrelhinha") != 0L) {
      dadosFc.setCoResultadoTesteOrelhinha(row.getLong("coResultadoTesteOrelhinha"));
    }

    dadosFc.setDataRealizacaoUSTransfontanela(dateToEpoch(row.getDate("dataRealizacaoUSTransfontanela")));
    if (row.getLong("coResultadoUsTransfontanela") != 0L) {
      dadosFc.setCoResultadoUsTransfontanela(row.getLong("coResultadoUsTransfontanela"));
    }

    dadosFc
      .setDataRealizacaoTomografiaComputadorizada(dateToEpoch(row.getDate("dataRealizacaoTomografiaComputadorizada")));
    if (row.getLong("coResultadoTomografiaComputadorizada") != 0L) {
      dadosFc.setCoResultadoTomografiaComputadorizada(row.getLong("coResultadoTomografiaComputadorizada"));
    }

    dadosFc.setDataRealizacaoRessonanciaMagnetica(dateToEpoch(row.getDate("dataRealizacaoRessonanciaMagnetica")));
    if (row.getLong("coResultadoRessonanciaMagnetica") != 0L) {
      dadosFc.setCoResultadoRessonanciaMagnetica(row.getLong("coResultadoRessonanciaMagnetica"));
    }
    return dadosFc;
  }

  private UnicaLotacaoHeaderTransport montaArrayUnica(ResultSet row) throws SQLException {
    UnicaLotacaoHeaderTransport headerTransport = new UnicaLotacaoHeaderTransport();
    headerTransport.setProfissionalCNS((validaCnsBanco(row.getString("profissionalCNS").trim())
      ? row.getString("profissionalCNS").trim()
      : null));
    headerTransport.setCboCodigo2002(row.getString("cboCodigo_2002"));
    headerTransport.setCnes(StringUtils.leftPad(row.getString("cnes"), 7, "0"));
    headerTransport.setIne(row.getString("ine"));
    headerTransport.setDataAtendimento(dateToEpoch(row.getDate("dataAtendimento")));
    headerTransport.setCodigoIbgeMunicipio(row.getString("codigoIbgeMunicipio"));
    return headerTransport;
  }

  private DadoTransporteTransportFichaComplementarXml montaArrayEnvioDto(
    FichaComplementarZikaMicrocefaliaTransport dadosComplementarSerializado, 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);

    DadoTransporteTransportFichaComplementarXml dadoTransporteTransportXml = new DadoTransporteTransportFichaComplementarXml();
    dadoTransporteTransportXml.setUuidDadoSerializado(uuid);
    dadoTransporteTransportXml.setTipoDadoSerializado(TipoDadoSerializado.COMPLEMENTAR.getValue());
    dadoTransporteTransportXml.setCnesDadoSerializado(StringUtils.leftPad(row.getString("cnes"), 7, "0"));
    dadoTransporteTransportXml.setNumLote(eehCodigo);
    dadoTransporteTransportXml.setCodIbge(row.getString("codigoIbgeMunicipio"));
    dadoTransporteTransportXml.setIneDadoSerializado(row.getString("ine"));
    dadoTransporteTransportXml.setRemetente(remetenteOriginadora);
    dadoTransporteTransportXml.setOriginadora(remetenteOriginadora);
    dadoTransporteTransportXml.setVersao(arrayVersao);
    dadoTransporteTransportXml.setFichaComplementarZikaMicrocefaliaTransport(dadosComplementarSerializado);

    return dadoTransporteTransportXml;
  }

}
