package br.com.elotech;

import br.com.elotech.commom.ConnectionUtil;
import br.com.elotech.commom.DePara;
import br.com.elotech.commom.Util;
import br.com.elotech.controllers.MainController;
import br.com.elotech.model.social.Unidade;
import br.com.elotech.model.social.Usuarios;
import javassist.NotFoundException;
import org.apache.commons.lang3.BooleanUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.Session;

import java.io.File;
import java.security.InvalidParameterException;

public class Main {

  private static final Logger logger = Logger.getLogger(Main.class.getName());
  public static Usuarios usuarios = new Usuarios();
  public static Unidade unidade;

  public static void main(String[] args) {
    try {
      verificaUnidadeImportacao(args);
      criaUsuario();
//      executaTesteBanco();
      logger.info("Iniciando importacao do arquivo");
      File file = Util.getFile();
      if (file != null) {
        (new MainController()).executar(file);
        logger.info("Finaliza importacao do arquivo");
      }
    } catch (Throwable e) {
      e.printStackTrace();
      logger.error(e);
    }
    System.exit(0);
  }

  private static void verificaUnidadeImportacao(String[] args) throws Throwable {
    Session session = ConnectionUtil.getSession();
    if(args.length == 0){
      logger.error("Codigo da unidade destino deve ser informada na chamada!");
      throw new NotFoundException("Codigo da unidade destino deve ser informada na chamada!");
    }else{
      if(!StringUtils.isNumeric(args[0])){
        logger.error("Codigo da unidade invalida!");
        throw new InvalidParameterException("Codigo da unidade invalida!");
      }
      Long uniCodigo = DePara.parseLong(args[0]);
      unidade = (Unidade) session
        .createQuery("from Unidade where id = :id")
        .setParameter("id", uniCodigo)
        .getResultList().stream().findFirst()
        .orElseThrow(()-> new NotFoundException("Unidade cod. " + uniCodigo + " nao encontrada"));
      if(BooleanUtils.isFalse(unidade.getUniAs())){
        logger.error(unidade.getUniDescricao().concat(" nao pertence ao sistema Social!"));
        throw new Exception(unidade.getUniDescricao().concat(" nao pertence ao sistema Social!"));
      }
    }
  }

  private static void criaUsuario() throws Exception {
    Session session = ConnectionUtil.getSession();
    try {
      usuarios = (Usuarios) session
        .createQuery("select u from Usuarios u WHERE u.usrLogin = :login AND u.usrSenha = :senha")
        .setParameter("login", usuarios.getUsrLogin())
        .setParameter("senha", usuarios.getUsrSenha())
        .getSingleResult();
    } catch (Exception e) {
      session.beginTransaction();
      session.save(new Usuarios());
      session.getTransaction().commit();
      session.close();
      criaUsuario();
    }
  }
}
