package br.com.elotech.controllers;

import br.com.elotech.commom.ConnectionUtil;
import br.com.elotech.commom.SetDadosUtil;
import br.com.elotech.model.Dados;
import br.com.elotech.model.familia.Familia;
import br.com.elotech.model.familia.membro.Membro;
import br.com.elotech.model.social.AsProntuarioSuas;
import br.com.elotech.model.social.Usuario;
import me.tongfei.progressbar.ProgressBar;
import org.apache.log4j.Logger;
import org.hibernate.Session;

import java.util.List;
import java.util.Objects;

/**
 * User: claiton.nazaret
 * Date: 26/02/2019
 * Time: 11:12
 */
public class PersistenceController {
  private static final Logger logger = Logger.getLogger(PersistenceController.class);

  private List<Usuario> usuarios;
  private Session session;

  public PersistenceController() throws Exception {
    session = ConnectionUtil.getSession();
    usuarios = (List<Usuario>) session
      .createQuery("from Usuario order by usu_codigo")
      .getResultList();
  }

  public boolean persisteDadosImportados(Dados dados) throws Exception {
    session.beginTransaction();

    // Arquivo
    logger.info("Salvando dados do arquivo");
    SetDadosUtil.setDadosArquivo(dados.getArquivo(), session);

    // Familias
    logger.info("Inicio da verificacao dos dados");
    verificaDados(dados.getFamilias());
    logger.info("Fim da verificacao dos dados");

    session.getTransaction().commit();
    session.close();
    return true;
  }

  private void verificaDados(List<Familia> familias) throws Exception {
    int qtdFamiliaCriada = 0;
    int qtdFamiliaAtualizada = 0;

    int qtdCidCriado = 0;
    int qtdCidAtualizado = 0;

    for (Familia familia: ProgressBar.wrap(familias, "Salvando Dados...")){
      AsProntuarioSuas asps = SetDadosUtil.verificaAsProntuarioSuas(familia, session);
      if(Objects.nonNull(asps.getId())) qtdFamiliaAtualizada++; else qtdFamiliaCriada++;
      SetDadosUtil.setAsProntuarioSuas(asps, session);
      SetDadosUtil.setAsProntuarioSuasUnidade(asps, session);
      for (Membro membro: familia.getMembros()){
        Usuario usuario = SetDadosUtil.verificaUsuario(usuarios, membro);
        if(Objects.nonNull(usuario.getUsuCodigo())) qtdCidAtualizado++; else qtdCidCriado++;
        SetDadosUtil.setUsuario(usuario, membro, session, asps.getAspsNumProntuario());
        SetDadosUtil.setAsProntuarioSuasUsuario(usuario, session, asps);
      }
    }

    logger.info(qtdFamiliaCriada + " familias criadas");
    logger.info(qtdFamiliaAtualizada + " familias atualizadas");

    logger.info(qtdCidCriado + " cidadaos criados");
    logger.info(qtdCidAtualizado + " cidadaos atualizados");

  }

}
