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.BancoConsumoAlimentar;
import br.com.elotech.websaude.integracao.esus.model.EsusHistoricoItens;
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.DadoTransporteTransportConsumoAlimentarXml;
import br.ufsc.esus.fichaconsumoalimentar.FichaConsumoAlimentarTransport;
import br.ufsc.esus.perguntacriancascommaisdoisanosenum.PerguntaCriancasComMaisDoisAnosEnumTransport;
import br.ufsc.esus.perguntacriancasdeseisvintetresmesesenum.PerguntaCriancasDeSeisVinteTresMesesEnumTransport;
import br.ufsc.esus.perguntacriancasmenoresseismesesenum.PerguntaCriancasMenoresSeisMesesEnumTransport;
import br.ufsc.esus.perguntaquestionariocriancascommaisdoisanos.PerguntaQuestionarioCriancasComMaisDoisAnosTransport;
import br.ufsc.esus.perguntaquestionariocriancasdeseisvintetresmeses.PerguntaQuestionarioCriancasDeSeisVinteTresMesesTransport;
import br.ufsc.esus.perguntaquestionariocriancasmenoresseismeses.PerguntaQuestionarioCriancasMenoresSeisMesesTransport;
import br.ufsc.esus.respostamultiplaescolhaenum.RespostaMultiplaEscolhaEnumTransport;
import br.ufsc.esus.respostaunicaescolhaenum.RespostaUnicaEscolhaEnumTransport;
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;

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

public class ConsumoAlimentar extends BD {

  public void executeMain(int eehCodigo, DadoInstalacaoTransport remetenteOriginadora)
    throws SQLException, JAXBException, IOException {
    BancoConsumoAlimentar bdConsumoAlimentar = new BancoConsumoAlimentar();
    EsusHistoricoItens bdEsusHistoricoItens = new EsusHistoricoItens();
    ResultSet dadosConsumoAlimentar = bdConsumoAlimentar.getDadosConsumoAlimentar();

    while (dadosConsumoAlimentar.next()) {
      ConsumoAlimentar consumoAlimentar = new ConsumoAlimentar();
      String uuid = consumoAlimentar.getGUID();
      FichaConsumoAlimentarTransport ficha = consumoAlimentarThrift(uuid, dadosConsumoAlimentar);
      DadoTransporteTransportConsumoAlimentarXml arrayEnvio = montaArrayEnvioDto(ficha, uuid,
        dadosConsumoAlimentar, eehCodigo, remetenteOriginadora);
      zipWriter(arrayEnvio, uuid);
      bdEsusHistoricoItens.registratHistoricoItens(eehCodigo, uuid, 12);
      bdConsumoAlimentar.atualizaStatus(uuid, dadosConsumoAlimentar.getInt("co_cds_consumo_alimentar"));
    }
    dadosConsumoAlimentar.close();
  }

  private void zipWriter(DadoTransporteTransportConsumoAlimentarXml xmlText, String uuid)
    throws JAXBException, IOException {
    // Define nome do arquivo
    String arquivo = uuid + ".esus.xml";
    br.ufsc.esus.dadotransporte.ObjectFactoryConsumoAlimentar factoryConsumoAlimentar = new br.ufsc.esus.dadotransporte.ObjectFactoryConsumoAlimentar();

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

  }

  private FichaConsumoAlimentarTransport consumoAlimentarThrift(String uuid, ResultSet row)
    throws SQLException {

    UnicaLotacaoHeaderTransport arrayUnica = montaArrayUnica(row);
    int codAtiv = row.getInt("co_cds_consumo_alimentar");
    Integer origem = 3;

    FichaConsumoAlimentarTransport dadosCat = new FichaConsumoAlimentarTransport();

    dadosCat.setHeaderTransport(arrayUnica);
    dadosCat.setUuidFicha(uuid);

    if ((validaCnsBanco(row.getString("eca_cidadao_cns")))) {
      dadosCat.setCnsCidadao(row.getString("eca_cidadao_cns"));
    } else if (validaCpf(row.getString("usu_cpf"))) {
      dadosCat.setCpfCidadao(row.getString("usu_cpf"));
    }

    dadosCat.setIdentificacaoUsuario(row.getString("eca_cidadao_nome"));
    dadosCat.setDataNascimento(DataConvert.dateToEpoch(row.getDate("eca_cidadao_dt_nasc")));
    dadosCat.setSexo(row.getLong("eca_cidadao_sexo"));
    dadosCat.setLocalAtendimento(row.getLong("eca_local_atendimento"));
    dadosCat.getPerguntasQuestionarioCriancasComMaisDoisAnos()
      .addAll(PerguntasQuestionarioCriancasComMaisDoisAnos(codAtiv));
    dadosCat.getPerguntasQuestionarioCriancasDeSeisVinteTresMeses()
      .addAll(PerguntasQuestionarioCriancasDeSeisVinteTresMeses(codAtiv));
    dadosCat.getPerguntasQuestionarioCriancasMenoresSeisMeses()
      .addAll(PerguntaQuestionarioCriancasMenoresSeisMeses(codAtiv));
    dadosCat.setTpCdsOrigem(origem);
    return dadosCat;
  }

  private UnicaLotacaoHeaderTransport montaArrayUnica(ResultSet row) throws SQLException {
    UnicaLotacaoHeaderTransport headerTransport = new UnicaLotacaoHeaderTransport();
    headerTransport.setProfissionalCNS((validaCnsBanco(row.getString("eca_profissional_cns").trim())
      ? row.getString("eca_profissional_cns").trim()
      : null));
    headerTransport.setCboCodigo2002(row.getString("eca_cbo"));
    headerTransport.setCnes(StringUtils.leftPad(row.getString("eca_cnes"), 7, "0"));
    headerTransport.setIne(row.getString("eca_ine"));
    headerTransport.setDataAtendimento(dateToEpoch(row.getDate("eca_dt_atividade")));
    headerTransport.setCodigoIbgeMunicipio(row.getString("eca_codigo_ibge"));
    return headerTransport;
  }

  private List<PerguntaQuestionarioCriancasComMaisDoisAnosTransport> PerguntasQuestionarioCriancasComMaisDoisAnos(
    int codAtiv) throws SQLException {
    br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar bdConsumoAlimentar = new br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar();
    ResultSet dados = bdConsumoAlimentar.getPerguntasQuestionarioCriancasComMaisDoisAnos(codAtiv);

    List<PerguntaQuestionarioCriancasComMaisDoisAnosTransport> arrayGeral = new ArrayList<>();

    PerguntaQuestionarioCriancasComMaisDoisAnosTransport linha12 = new PerguntaQuestionarioCriancasComMaisDoisAnosTransport();

    while (dados.next()) {

      PerguntaQuestionarioCriancasComMaisDoisAnosTransport linha = new PerguntaQuestionarioCriancasComMaisDoisAnosTransport();

      String pergunta = dados.getString("no_qst_pergunta");
      String resposta = dados.getString("no_qst_resposta");

      if (pergunta.equals("QUAIS_REFEICOES_VOCE_FAZ_AO_LONGO_DO_DIA")) {

        linha12.setPergunta(PerguntaCriancasComMaisDoisAnosEnumTransport.valueOf(pergunta.toUpperCase()));
        linha12.getRespostaMultiplaEscolha()
          .add(RespostaMultiplaEscolhaEnumTransport.valueOf(resposta.toUpperCase()));

      } else {

        linha.setPergunta(PerguntaCriancasComMaisDoisAnosEnumTransport.valueOf(pergunta.toUpperCase()));
        linha.setRespostaUnicaEscolha(RespostaUnicaEscolhaEnumTransport.valueOf(resposta.toUpperCase()));

        arrayGeral.add(linha);
      }

    }
    arrayGeral.add(linha12);
    return arrayGeral;
  }

  private List<PerguntaQuestionarioCriancasMenoresSeisMesesTransport> PerguntaQuestionarioCriancasMenoresSeisMeses(
    int codAtiv) throws SQLException {
    br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar bdConsumoAlimentar = new br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar();
    ResultSet dados = bdConsumoAlimentar.getPerguntasQuestionarioCriancasMenoresSeisMeses(codAtiv);
    List<PerguntaQuestionarioCriancasMenoresSeisMesesTransport> arrayGeral = new ArrayList<>();

    while (dados.next()) {
      PerguntaQuestionarioCriancasMenoresSeisMesesTransport array = new PerguntaQuestionarioCriancasMenoresSeisMesesTransport();

      String pergunta = dados.getString("no_qst_pergunta");
      String resposta = dados.getString("no_qst_resposta");

      array.setPergunta(PerguntaCriancasMenoresSeisMesesEnumTransport.valueOf(pergunta.toUpperCase()));
      array.setRespostaUnicaEscolha(RespostaUnicaEscolhaEnumTransport.valueOf(resposta.toUpperCase()));

      arrayGeral.add(array);
    }
    dados.close();
    return arrayGeral;
  }

  private List<PerguntaQuestionarioCriancasDeSeisVinteTresMesesTransport> PerguntasQuestionarioCriancasDeSeisVinteTresMeses(
    int codAtiv) throws SQLException {
    br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar bdConsumoAlimentar = new br.com.elotech.websaude.integracao.esus.model.BancoConsumoAlimentar();
    ResultSet dados = bdConsumoAlimentar.getPerguntasQuestionarioCriancasDeSeisVinteTresMeses(codAtiv);

    List<PerguntaQuestionarioCriancasDeSeisVinteTresMesesTransport> arrayGeral = new ArrayList<>();

    while (dados.next()) {
      PerguntaQuestionarioCriancasDeSeisVinteTresMesesTransport array = new PerguntaQuestionarioCriancasDeSeisVinteTresMesesTransport();

      String pergunta = dados.getString("no_qst_pergunta");
      String resposta = dados.getString("no_qst_resposta");

      array.setPergunta(PerguntaCriancasDeSeisVinteTresMesesEnumTransport.valueOf(pergunta.toUpperCase()));
      array.setRespostaUnicaEscolha(RespostaUnicaEscolhaEnumTransport.valueOf(resposta.toUpperCase()));

      arrayGeral.add(array);
    }
    dados.close();
    return arrayGeral;
  }

  private DadoTransporteTransportConsumoAlimentarXml montaArrayEnvioDto(
    FichaConsumoAlimentarTransport dadosConsumoAlimentarSerializado, 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);

    DadoTransporteTransportConsumoAlimentarXml dadoTransporteTransportXml = new DadoTransporteTransportConsumoAlimentarXml();
    dadoTransporteTransportXml.setUuidDadoSerializado(uuid);
    dadoTransporteTransportXml.setTipoDadoSerializado(12);
    dadoTransporteTransportXml.setCnesDadoSerializado(StringUtils.leftPad(row.getString("eca_cnes"), 7, "0"));
    dadoTransporteTransportXml.setNumLote(eehCodigo);
    dadoTransporteTransportXml.setCodIbge(row.getString("eca_codigo_ibge"));
    dadoTransporteTransportXml.setIneDadoSerializado(row.getString("eca_ine"));
    dadoTransporteTransportXml.setRemetente(remetenteOriginadora);
    dadoTransporteTransportXml.setOriginadora(remetenteOriginadora);
    dadoTransporteTransportXml.setVersao(arrayVersao);
    dadoTransporteTransportXml.setFichaConsumoAlimentarTransport(dadosConsumoAlimentarSerializado);

    return dadoTransporteTransportXml;
  }

}
