package br.com.elotech.commom;

import br.com.elotech.Main;
import br.com.elotech.controllers.PersistenceController;
import br.com.elotech.model.arquivo.Arquivo;
import br.com.elotech.model.arquivo.Reg00;
import br.com.elotech.model.arquivo.Reg98;
import br.com.elotech.model.arquivo.Reg99;
import br.com.elotech.model.familia.Familia;
import br.com.elotech.model.familia.membro.Membro;
import br.com.elotech.model.social.*;
import com.google.gson.Gson;
import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import org.hibernate.Session;

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

/**
 * User: claiton.nazaret
 * Date: 25/03/2019
 * Time: 12:20
 */
public abstract class SetDadosUtil {

  private static final Logger logger = Logger.getLogger(SetDadosUtil.class);

  public static AsProntuarioSuas verificaAsProntuarioSuas(Familia familia, Session session) {
    Long numProntuario = Long.parseLong(familia.getReg01().getCodFamiliarFam(), 10);
    AsProntuarioSuas asps = (AsProntuarioSuas) session
      .createQuery("from AsProntuarioSuas where aspsNumProntuario = :numProntuario")
      .setParameter("numProntuario", numProntuario)
      .getResultList().stream().findFirst().orElse(new AsProntuarioSuas());
    asps.setAspsNumProntuario(numProntuario);
    asps.setAspsNumHabitacional(numProntuario);
    return asps;
  }

  public static void setAsProntuarioSuas(AsProntuarioSuas asps, Session session){
    asps.setAspsData(Calendar.getInstance().getTime());
    asps.setUsrCodigo(Main.usuarios.getUsrCodigo().intValue());
    session.saveOrUpdate(asps);
  }


  public static Usuario setUsuario(Usuario usuario, Membro membro, Session session, Long aspsNumProntuario) {
    /*Dados Básicos (Reg04) */
    usuario.setUsuNome(membro.getReg04().getNomPessoa());
    usuario.setUsuNumOrdem(DePara.ordem(membro.getReg04().getNumOrdemPessoa()));
    usuario.setRacCodigo(membro.getReg04().getCodRacaCorPessoa());
    usuario.setUsuAsApelido(membro.getReg04().getNomApelidoPessoa());
    usuario.setUsuSexo(DePara.sexo(membro.getReg04().getCodSexoPessoa()));
    usuario.setAspsuParentesco(DePara.parentesco(membro.getReg04().getCodParentescoRfPessoa()));
    usuario.setUsuAspsAtivo(true);

    if(usuario.getAspsuParentesco() != null && usuario.getAspsuParentesco().equals(1)){
      usuario.setUsuStResponsavelFamiliar("S");
      usuario.setUsuAspsRef(true);
    }
    /*Nascimento*/
    usuario.setUsuDatanasc(membro.getReg04().getDtaNascPessoa());
    usuario.setUsuCidadeNasc(membro.getReg04().getNomIbgeMunicNascPessoa());
    usuario.setCidCodigoNasc(DePara.parseLong(membro.getReg04().getCodIbgeMunicNascPessoa()));
    if(StringUtils.isBlank(membro.getReg04().getCodPaisOrigemPessoa())){
      usuario.setCdNacionalidade("B");
    }

    usuario.setFamCodigo(aspsNumProntuario);
    usuario.setUsuNis(membro.getReg04().getNuNisOriginal());
    /*Parentesco*/
    usuario.setUsuMae(membro.getReg04().getNomCompletoMaePessoa());
    if(membro.getReg04().getIndNomCompletoMaePessoa().equals("1")){
      usuario.setUsuMae("Desconhecido");
    }
    usuario.setUsuPai(membro.getReg04().getNomCompletoPaiPessoa());
    if(membro.getReg04().getIndNomCompletoPaiPessoa().equals("1")){
      usuario.setUsuPai("Desconhecido");
    }

    usuario.setIdUsuario(Main.usuarios.getUsrCodigo().toString());
    usuario.setCidCodigoNasc(DePara.parseLong(membro.getReg04().getCodIbgeMunicNascPessoa()));
    usuario.setUsrAltDt(Calendar.getInstance().getTime());
    usuario.setUsuProntuarioNum(aspsNumProntuario.intValue());

    /*Documentos (Reg05)*/
    AsTipoCertidao atc = null;
    if(Objects.nonNull(membro.getReg05())){
      /*CPF*/
      usuario.setUsuCpf(membro.getReg05().getNumCpfPessoa());
      /*Certidão*/
      usuario.setUsuTipoCertidao(DePara.parseInt(membro.getReg05().getCodCertidaoCivilPessoa()));
      usuario.setUsuCertCartorio(membro.getReg05().getNomCartorioPessoa());
      usuario.setUsuCertLivro(membro.getReg05().getCodLivroTermoCertidPessoa());
      usuario.setUsuCertEmissao(membro.getReg05().getDtaEmissaoCertidPessoa());
      /*RG*/
      usuario.setUsuRg(membro.getReg05().getNumIdentidadePessoa());
      usuario.setUsuRgCompl(membro.getReg05().getCodComplementoPessoa());
      usuario.setUsuRgEmissor(membro.getReg05().getSigOrgaoEmissorPessoa());
      usuario.setUsuRgDtEmissao(membro.getReg05().getDtaEmissaoIdentPessoa());
      /*CTPS*/
      usuario.setUsuCtps(membro.getReg05().getNumCartTrabPrevSocPessoa());
      usuario.setUsuAsdocCtpsprov(StringUtils.isNotBlank(usuario.getUsuCtps()) ? "t" : "f");
      usuario.setUsuCtpsSerie(membro.getReg05().getNumSerieTrabPrevSocPessoa());
      usuario.setUsuCtpsDtEmissao(membro.getReg05().getDtaEmissaoCartTrabPessoa());
      /*Título Eleitor*/
      usuario.setUsuTitEleitor(membro.getReg05().getNumTituloEleitorPessoa());
      usuario.setUsuTitEleitorZona(membro.getReg05().getNumZonaTitEleitorPessoa());
      usuario.setUsuTitEleitorSecao(membro.getReg05().getNumSecaoTitEleitorPessoa());

      /*Tipo de Certidão*/
      if(Objects.nonNull(usuario.getUsuTipoCertidao())){
        atc = (AsTipoCertidao) session
          .createQuery("from AsTipoCertidao where usuario = :usuario order by id")
          .setParameter("usuario", usuario.getUsuarios())
          .getResultList().stream().findFirst()
          .orElse(new AsTipoCertidao());
        atc.setUsuario(usuario);
        atc.setTipoCertidao(usuario.getUsuTipoCertidao());
        atc.setCodigoCartorio(membro.getReg05().getCodCartorioCertidPessoa());
        atc.setNomeCartorio(membro.getReg05().getNomCartorioPessoa());
        atc.setNumeroLivro(membro.getReg05().getCodLivroTermoCertidPessoa());
        atc.setNumeroFolha(membro.getReg05().getCodFolhaTermoCertidPessoa());
        atc.setNumeroTermo(membro.getReg05().getCodTermoMatriculaCertidPessoa());
        atc.setDataRegistro(membro.getReg05().getDtaEmissaoCertidPessoa());
        atc.setEstadoRegistro(DePara.parseEstadoRegistro(membro.getReg05().getSigUfCertidPessoa()));
        atc.setMunicipioRegistro(StringUtils.upperCase(membro.getReg05().getNomMunicCertidPessoa()));
      }
    }
    /*Dados deficiencia (Reg06)*/
    if(Objects.nonNull(membro.getReg06())){
      usuario.setUsuDeficiencia(DePara.parseBoolean(membro.getReg06().getCodDeficienciaMemb()));
      usuario.setUsuAsdeficiencia(DePara.parseBoolean(membro.getReg06().getCodDeficienciaMemb()));
      usuario.setUsuAsCuidadoConstante(DePara.verificaCuidadoConstante(membro.getReg06()));
      if(usuario.getUsuAsdeficiencia()){
        usuario.setUsuAsTipoDeficiencia(DePara.tipoDeficiencia(membro.getReg06()));
      }
    }
    /*Dados escolaridade (Reg07)*/
    if(Objects.nonNull(membro.getReg07())){
      usuario.setAsUsuAlfabetizado(DePara.parseBoolean(membro.getReg07().getCodSabeLerEscreverMemb()));
      usuario.setAsUsuEstuda(DePara.parseBoolFrequentaEscola(membro.getReg07().getIndFrequentaEscolaMemb()));
      /*Nunca frequentou*/
      if(StringUtils.isNotBlank(membro.getReg07().getIndFrequentaEscolaMemb())){
        if(membro.getReg07().getIndFrequentaEscolaMemb().trim().equals("4")){
          usuario.setAsUsuEscolaridade(101);
        }else {
          /*Já frequentou, não frequenta mais  ou Frequenta*/
          usuario.setAsUsuEscolaridade(DePara.escolaridade(membro.getReg07(), !membro.getReg07().getIndFrequentaEscolaMemb().trim().equals("3")));
        }

      }
      /*Dados Trabalhistas (Reg08)*/
      if(Objects.nonNull(membro.getReg08())){
        usuario.setAsCondOcupacao(DePara.ocupacao(membro.getReg08()));
      }
    }

    usuario.setUsuObito("f");
    usuario.setUsuAtivacao("S");
    usuario.setUsuBloqueado(false);
    if(Objects.isNull(usuario.getUsuCodigo())){
      usuario.setUsuarios(Main.usuarios);
      usuario.setUsrCad(usuario.getUsuarios().getUsrCodigo().intValue());
    }else{
      usuario.setUsrAlt(Main.usuarios.getUsrCodigo().intValue());
    }

    session.saveOrUpdate(usuario);
    if(Objects.nonNull(atc)){
      session.saveOrUpdate(atc);
    }

    return usuario;
  }

  public static AsProntuarioSuasUsuario setAsProntuarioSuasUsuario(Usuario usuario, Session session, AsProntuarioSuas asps) {
    AsProntuarioSuasUsuario aspsu = (AsProntuarioSuasUsuario) session
      .createQuery("from AsProntuarioSuasUsuario where asProntuarioSuas = :asps and usuario = :usuario")
      .setParameter("asps", asps)
      .setParameter("usuario", usuario)
      .getResultList().stream().findFirst()
      .orElse(new AsProntuarioSuasUsuario());
    aspsu.setAsProntuarioSuas(asps);
    aspsu.setUsuario(usuario);
    aspsu.setAspsuNumOrdem(usuario.getUsuNumOrdem());
    aspsu.setAspsuParentesco(usuario.getAspsuParentesco());
    aspsu.setAspsuAtivo(true);
    session.saveOrUpdate(aspsu);
    return null;
  }

  public static Usuario verificaUsuario(List<Usuario> usuarios, Membro membro) {
    Usuario usuCompare = new Usuario();
    usuCompare.setUsuNis(membro.getReg04().getNuNisOriginal());
    if(Objects.nonNull(membro.getReg05())){
      usuCompare.setUsuCpf(membro.getReg05().getNumCpfPessoa());
    }
    usuCompare.setUsuNome(membro.getReg04().getNomPessoa());
    usuCompare.setUsuMae(membro.getReg04().getNomCompletoMaePessoa());
    usuCompare.setUsuDatanasc(membro.getReg04().getDtaNascPessoa());

    for (Usuario u: usuarios){
      if(u.equals(usuCompare)){
        u.setDtAlteracao(Calendar.getInstance().getTime());
        return u;
      }
    }
    Usuario usuario = new Usuario();
    usuario.setDtInclusao(Calendar.getInstance().getTime());
    usuario.setDtAlteracao(Calendar.getInstance().getTime());
    return usuario;
  }

  public static void setAsProntuarioSuasUnidade(AsProntuarioSuas asps, Session session) {
    Unidade unidade = Main.unidade;
    AsProntuarioSuasUnidade aspsuni = (AsProntuarioSuasUnidade) session
      .createQuery("from AsProntuarioSuasUnidade where asProntuarioSuas = :asps and unidade = :unidade")
      .setParameter("asps", asps)
      .setParameter("unidade", unidade)
      .getResultStream().findFirst()
      .orElse(new AsProntuarioSuasUnidade());
    aspsuni.setAsProntuarioSuas(asps);
    aspsuni.setUnidade(unidade);
    aspsuni.setDtInicio(Calendar.getInstance().getTime());
    session.saveOrUpdate(aspsuni);
  }


  public static void setDadosArquivo(Arquivo arquivo, Session session) {
    CadUniArquivo cua = (CadUniArquivo) session
      .createQuery("from CadUniArquivo where arquivo = :arquivo")
      .setParameter("arquivo", arquivo.getArquivo().toLowerCase())
      .getResultStream().findFirst()
      .orElse(new CadUniArquivo());

    Reg00 r00 = arquivo.getReg00();
    Reg98 r98 = arquivo.getReg98();
    Reg99 r99 = arquivo.getReg99();

    if(Objects.isNull(cua.getCodigo())){
      cua.setDtImportacao(Calendar.getInstance().getTime());
    }else{
      logger.info("Arquivo " + arquivo.getArquivo() + " ja importado. Dados serao atualizados");
    }


    cua.setArquivo(arquivo.getArquivo().toLowerCase());
    cua.setDtAlteracao(Calendar.getInstance().getTime());
    cua.setNomArquivoHdr(r00.getNomArquivoHdr());
    cua.setCodVersaoLayoutHdr(r00.getCodVersaoLayoutHdr());
    cua.setDtaPosicaoCadastroHdr(Util.dateToTimeStamp(r00.getDtaPosicaoCadastroHdr()));
    cua.setDtaExtracaoDadosHdr(Util.dateToTimeStamp(r00.getDtaExtracaoDadosHdr()));

    cua.setChvNaturalPrefeitura(r98.getChvNaturalPrefeitura());
    cua.setCodMunicIbge2Pre(r98.getCodMunicIbge2Pre());
    cua.setCodMunicIbge5Pre(r98.getCodMunicIbge5Pre());
    cua.setIndMigracaoPre(r98.getIndMigracaoPre());
    cua.setNomPrefeituraPre(r98.getNomPrefeituraPre());

    cua.setQtdReg00Tlr(r99.getQtdReg00Tlr());
    cua.setQtdReg01Tlr(r99.getQtdReg01Tlr());
    cua.setQtdReg02Tlr(r99.getQtdReg02Tlr());
    cua.setQtdReg03Tlr(r99.getQtdReg03Tlr());
    cua.setQtdReg04Tlr(r99.getQtdReg04Tlr());
    cua.setQtdReg05Tlr(r99.getQtdReg05Tlr());
    cua.setQtdReg06Tlr(r99.getQtdReg06Tlr());
    cua.setQtdReg07Tlr(r99.getQtdReg07Tlr());
    cua.setQtdReg08Tlr(r99.getQtdReg08Tlr());
    cua.setQtdReg09Tlr(r99.getQtdReg09Tlr());
    cua.setQtdReg10Tlr(r99.getQtdReg10Tlr());
    cua.setQtdReg11Tlr(r99.getQtdReg11Tlr());
    cua.setQtdReg12Tlr(r99.getQtdReg12Tlr());
    cua.setQtdReg13Tlr(r99.getQtdReg13Tlr());
    cua.setQtdReg14Tlr(r99.getQtdReg14Tlr());
    cua.setQtdReg15Tlr(r99.getQtdReg15Tlr());
    cua.setQtdReg16Tlr(r99.getQtdReg16Tlr());
    cua.setQtdReg17Tlr(r99.getQtdReg17Tlr());
    cua.setQtdReg18Tlr(r99.getQtdReg18Tlr());
    cua.setQtdReg19Tlr(r99.getQtdReg19Tlr());
    cua.setQtdReg98Tlr(r99.getQtdReg98Tlr());
    cua.setQtdReg99Tlr(r99.getQtdReg99Tlr());

    session.save(cua);
  }
}
