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

import br.com.elotech.websaude.integracao.esus.model.EsusHistorico;
import br.com.elotech.websaude.integracao.esus.util.Compactador;
import br.ufsc.esus.dadoinstalacao.DadoInstalacaoTransport;
import br.ufsc.esus.fichaavaliacaoelegibilidade.FichaAvaliacaoElegibilidadeTransport;
import org.apache.commons.io.comparator.LastModifiedFileComparator;

import java.io.File;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.logging.FileHandler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;

import static br.com.elotech.websaude.integracao.esus.model.dao.Conexao.CONN;

public class DadosEsus {

  private Logger logg;

  public DadosEsus() {
    try {
      FileHandler fh = new FileHandler("LogEsusExportacao.log", false);
      logg = Logger.getLogger("LogEsusExportacao");
      logg.setUseParentHandlers(false);
      logg.addHandler(fh);
      SimpleFormatter formatter = new SimpleFormatter();
      fh.setFormatter(formatter);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }

  public void geraArquivo() {
    DateFormat dt = new SimpleDateFormat("dd/MM/yyyy HH:mm");
    logger("Exportação e-SUS ".concat(dt.format(new Date())).concat("\n"));
    varreServidorArqs();
    String sql = "SELECT * FROM esus_remente_originadora WHERE ero_status = 't'";
    try {
      PreparedStatement pstmt = CONN.prepareStatement(sql);
      ResultSet dadosRO = pstmt.executeQuery();
      EsusHistorico bdHist = new EsusHistorico();
      int eehCodigo = bdHist.initHistorico();
      bdHist.setDtInicial(new Date());
      DadoInstalacaoTransport remetenteOriginadora = new DadoInstalacaoTransport();
      if (dadosRO.next()) {
        remetenteOriginadora
          .setContraChave((dadosRO.getString("ero_contra_chave") != null ? dadosRO.getString("ero_contra_chave") : ""));
        remetenteOriginadora.setCpfOuCnpj(dadosRO.getString("ero_cpf_cnpj"));
        remetenteOriginadora.setNomeOuRazaoSocial(dadosRO.getString("ero_nome_razao"));
        remetenteOriginadora.setFone(dadosRO.getString("ero_fone"));
        remetenteOriginadora.setEmail(dadosRO.getString("ero_email"));
      }
      dadosRO.close();
      // Atendimento Individual
      logger("Iniciando Atendimento Individual");
      AteIndividual bdAteIndividual = new AteIndividual();
      bdAteIndividual.executeMain(eehCodigo, remetenteOriginadora);
      logger("Atendimento Individual Finalizado \n");

      // Cadastro Domiciliar
      logger("Iniciando Cadastro Domiciliar");
      CadastroDomiciliar bdCadDomiciliar = new CadastroDomiciliar();
      bdCadDomiciliar.executeMain(eehCodigo, remetenteOriginadora);
      logger("Cadastro Domiciliar Finalizado \n");

      // Cadastro Individual
      logger("Iniciando Cadastro Individual");
      CadastroIndividual bdCadIndividual = new CadastroIndividual();
      bdCadIndividual.executeMain(eehCodigo, remetenteOriginadora);
      logger("Cadastro Individual Finalizado \n");

      //Atividade Coletiva
      logger("Iniciando Atividade Coletiva");
      AtividadeColetiva bdAtiColetiva = new AtividadeColetiva();
      bdAtiColetiva.executeMain(eehCodigo, remetenteOriginadora);
      logger("Atividade Coletiva Finalizado \n");

      // Odonto
      logger("Iniciando Odonto");
      Odonto bdOdonto = new Odonto();
      bdOdonto.executeMain(eehCodigo, remetenteOriginadora);
      logger("Odonto Finalizado \n");

      // Procedimento
      logger("Iniciando Procedimento");
      Procedimento bdProcedimento = new Procedimento();
      bdProcedimento.executeMain(eehCodigo, remetenteOriginadora);
      logger("Procedimento Finalizado \n");

      // Visita Domiciliar
      logger("Iniciando Visita Domiciliar");
      VisitaDomiciliar bdVisDomiciliar = new VisitaDomiciliar();
      bdVisDomiciliar.executeMain(eehCodigo, remetenteOriginadora);
      logger("Visita Domiciliar Finalizado \n");

      // Consumo Alimentar
      logger("Iniciando Consumo Alimentar");
      ConsumoAlimentar bdConsumo = new ConsumoAlimentar();
      bdConsumo.executeMain(eehCodigo, remetenteOriginadora);
      logger("Consumo Alimentar Finalizado \n");

      //Ficha Complementar
      logger("Iniciando Ficha Complementar");
      FichaComplementar bdFichaComplementar = new FichaComplementar();
      bdFichaComplementar.executeMain(eehCodigo, remetenteOriginadora);
      logger("Ficha Complementar ZikaMicrocefalia Finalizado \n");

      //Ficha Vacinação
      logger("Iniciando Ficha Vacinação");
      FichaVacinacao bdFichaVacinacao = new FichaVacinacao();
      bdFichaVacinacao.executeMain(eehCodigo, remetenteOriginadora);
      logger("Ficha Vacinação Finalizado \n");

      //Ficha Avaliação de Elegibilidade e Admissão
      logger("Iniciando Ficha Avaliação de Elegibilidade e Admissão");
      AvaliacaoElegibilidadeAdmissao avaliacaoElegibilidadeAdmissao = new AvaliacaoElegibilidadeAdmissao();
      avaliacaoElegibilidadeAdmissao.executeMain(eehCodigo, remetenteOriginadora);
      logger("Ficha Avaliação de Elegibilidade e Admissão Finalizada! \n");

      //Ficha de Atendimento Domiciliar
      logger("Iniciando Ficha de Atendimento Domiciliar");
      FichaAtendimentoDomicilar fichaAtendimentoDomicilar = new FichaAtendimentoDomicilar();
      fichaAtendimentoDomicilar.executeMain(eehCodigo, remetenteOriginadora);
      logger("Ficha de Atendimento Domiciliar Finalizada! \n");

      logger("Compactando Arquivos");
      Compactador.compactarParaZip("arqs/RAS_FileZip_" + eehCodigo + ".zip");
      logger("Arquivos Compactados \n");

      bdHist.setDtFinal(new Date());
      bdHist.gravaHistorico(eehCodigo);
      logger("Processo Finalizado");

    } catch (Exception e) {
      logger(e.getMessage());
    }
  }

  private void logger(String dados) {
    logg.info(dados);
  }

  public void varreServidorArqs() {
    File directory = new File("arqs/");
    if (!directory.exists()) {
      directory.mkdir();
    }
    if (!directory.canWrite()) {
      try {
        throw new Exception("Não é possível escrever.");
      } catch (Exception ex) {
        Logger.getLogger(DadosEsus.class.getName()).log(Level.SEVERE, null, ex);
      }
    }
    File[] arqs = directory.listFiles();
    Arrays.sort(arqs, LastModifiedFileComparator.LASTMODIFIED_COMPARATOR);
    for (File file : arqs) {

      Date ultModificado = new Date(file.lastModified());
      if (ultModificado
        .before(new Date(ultModificado.getYear(), ultModificado.getMonth() - 4, ultModificado.getDay()))) {
        if (file.canWrite()) {
          file.deleteOnExit();
        }
      }

      if (file.getName().contains(".esus.xml")) {
        file.deleteOnExit();
      }
    }
  }

}
