package br.com.elotech.model.social;

import br.com.elotech.commom.Util;
import lombok.Data;
import org.apache.commons.lang3.StringUtils;

import javax.persistence.*;
import java.util.Calendar;
import java.util.Date;
import java.util.Objects;

/**
 * User: claiton.nazaret
 * Date: 14/03/2019
 * Time: 08:24
 */
@Entity
@Table(name = "usuario", schema = "social")
@Data
public class Usuario {
  @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
  @Column(name = "usu_codigo")
  private Long usuCodigo;

  @Column(name = "usu_nome")
  private String usuNome;

  @Column(name = "fam_codigo")
  private Long famCodigo;

  @Column(name = "usu_observacao")
  private String usuObservacao;

  @Column(name = "usu_sexo", columnDefinition = "bpchar")
  private String usuSexo;

  @Column(name = "usu_datanasc")
  @Temporal(TemporalType.DATE)
  private Date usuDatanasc;

  @Column(name = "cid_codigo_nasc")
  private Long cidCodigoNasc;

  @Column(name = "usu_dt_entrada_pais")
  @Temporal(TemporalType.DATE)
  private Date usuDtEntradaPais;

  @Column(name = "usu_sit_familiar")
  private String usuSitFamiliar;

  @Column(name = "usu_ocupacao")
  private String usuOcupacao;

  @Column(name = "usu_cbo_r1")
  private Integer usuCboR1;

  @Column(name = "usu_pis_pasep")
  private String usuPisPasep;

  @Column(name = "usu_cpf")
  private String usuCpf;

  @Column(name = "usu_cartao_p_sus")
  private String usuCartaoPSus;

  @Column(name = "usu_cartao_sus")
  private String usuCartaoSus;

  @Column(name = "usu_tipo_certidao")
  private Integer usuTipoCertidao;

  @Column(name = "usu_cert_cartorio")
  private String usuCertCartorio;

  @Column(name = "usu_cert_livro")
  private String usuCertLivro;

  @Column(name = "usu_cert_termo")
  private String usuCertTermo;

  @Column(name = "usu_cert_emissao")
  @Temporal(TemporalType.DATE)
  private Date usuCertEmissao;

  @Column(name = "usu_rg")
  private String usuRg;

  @Column(name = "usu_rg_compl")
  private String usuRgCompl;

  @Column(name = "usu_rg_dt_emissao")
  @Temporal(TemporalType.DATE)
  private Date usuRgDtEmissao;

  @Column(name = "usu_ctps")
  private String usuCtps;

  @Column(name = "usu_ctps_serie")
  private String usuCtpsSerie;

  @Column(name = "usu_ctps_dt_emissao")
  @Temporal(TemporalType.DATE)
  private Date usuCtpsDtEmissao;

  @Column(name = "usu_tit_eleitor")
  private String usuTitEleitor;

  @Column(name = "usu_tit_eleitor_zona")
  private String usuTitEleitorZona;

  @Column(name = "usu_tit_eleitor_secao")
  private String usuTitEleitorSecao;

  @Column(name = "usu_mae")
  private String usuMae;

  @Column(name = "usu_pai")
  private String usuPai;

  @Column(name = "rac_codigo")
  private String racCodigo;

  @Column(name = "usu_cisvir")
  private String usuCisvir;

  @Column(name = "usu_end_rua")
  private String usuEndRua;

  @Column(name = "usu_end_nr")
  private String usuEndNr;

  @Column(name = "usu_end_compl")
  private String usuEndCompl;

  @Column(name = "usu_end_bairro")
  private String usuEndBairro;

  @Column(name = "usu_end_cep")
  private String usuEndCep;

  @Column(name = "usu_end_cidade")
  private String usuEndCidade;

  @Column(name = "usu_cidade_nasc")
  private String usuCidadeNasc;

  @Column(name = "usu_fone")
  private String usuFone;

  @Column(name = "usu_celular")
  private String usuCelular;

  @Column(name = "usu_same")
  private String usuSame;

  @Column(name = "usu_prontuario")
  private String usuProntuario;

  @Column(name = "uni_origem")
  private Long uniOrigem;

  @Column(name = "usu_freq_escolar", columnDefinition = "bpchar")
  private String usuFreqEscolar;

  @Column(name = "uni_unidade_bkp")
  private String uniUnidadeBkp;

  @Column(name = "usr_cad")
  private Integer usrCad;

  @Column(name = "usr_alt")
  private Integer usrAlt;

  @Column(name = "dt_add")
  @Temporal(TemporalType.TIMESTAMP)
  private Date dtAdd;

  @Column(name = "dt_update")
  private Integer dtUpdate;

  @Column(name = "usu_ibge_codigo")
  private String usuIbgeCodigo;

  @Column(name = "id_rua")
  private Long idRua;

  @Column(name = "usu_resp_nome")
  private String usuRespNome;

  @Column(name = "usu_resp_doc_tipo")
  private String usuRespDocTipo;

  @Column(name = "usu_resp_doc")
  private String usuRespDoc;

  @Column(name = "usr_cad_dt")
  @Temporal(TemporalType.TIMESTAMP)
  private Date usrCadDt = Calendar.getInstance().getTime();

  @Column(name = "usr_alt_dt")
  @Temporal(TemporalType.TIMESTAMP)
  private Date usrAltDt = Calendar.getInstance().getTime();

  @Column(name = "muni_cd_cod_ibge_resid")
  private String muniCdCodIbgeResid;

  @Column(name = "uni_unidade")
  private Long uniUnidade;

  @Column(name = "muni_cd_cod_ibge_nasc")
  private String muniCdCodIbgeNasc;

  @Column(name = "id_usuario")
  private String idUsuario;

  @Column(name = "cd_nacionalidade")
  private String cdNacionalidade;

  @Column(name = "dt_naturalizacao")
  @Temporal(TemporalType.DATE)
  private Date dtNaturalizacao;

  @Column(name = "dt_preenchimento_form")
  @Temporal(TemporalType.DATE)
  private Date dtPreenchimentoForm;

  @Column(name = "dt_inclusao")
  @Temporal(TemporalType.DATE)
  private Date dtInclusao;

  @Column(name = "dt_alteracao")
  @Temporal(TemporalType.DATE)
  private Date dtAlteracao;

  @Column(name = "nr_uso_municipal")
  private String nrUsoMunicipal;

  @Column(name = "nr_portaria_naturalizacao")
  private String nrPortariaNaturalizacao;

  @Column(name = "uf_codigo_pac")
  private String ufCodigoPac;

  @Column(name = "usu_escolaridade")
  private String usuEscolaridade;

  @Column(name = "usu_st_conjugal")
  private String usuStConjugal;

  @Column(name = "usu_nr_ficha")
  private Long usuNrFicha;

  @Column(name = "usu_cadastrador", columnDefinition = "bpchar")
  private String usuCadastrador;

  @Column(name = "usu_bolsa_alimentacao", columnDefinition = "bpchar")
  private String usuBolsaAlimentacao;

  @Column(name = "usu_prodea", columnDefinition = "bpchar")
  private String usuProdea;

  @Column(name = "usu_nome_operador", columnDefinition = "bpchar")
  private String usuNomeOperador;

  @Column(name = "usu_situacao_emprego", columnDefinition = "bpchar")
  private String usuSituacaoEmprego;

  @Column(name = "usu_renda_media", columnDefinition = "numeric(20, 2)")
  private Double usuRendaMedia;

  @Column(name = "usu_doencas")
  private String usuDoencas;

  @Column(name = "usu_habitos_vida")
  private String usuHabitosVida;

  @Column(name = "usu_nr_lote")
  private String usuNrLote;

  @Column(name = "usu_reservista")
  private String usuReservista;

  @Column(name = "usu_cnh_numero")
  private String usuCnhNumero;

  @Column(name = "usu_cnh_categoria")
  private String usuCnhCategoria;

  @Column(name = "usu_fone_recado")
  private String usuFoneRecado;

  @Column(name = "usu_email")
  private String usuEmail;

  @Column(name = "usu_zona_residencia")
  private String usuZonaResidencia;

  @Column(name = "usu_estado_civil", columnDefinition = "bpchar")
  private String usuEstadoCivil;

  @Column(name = "usu_conjuge")
  private String usuConjuge;

  @Column(name = "nesp_codigo")
  private Long nespCodigo;

  @Column(name = "usu_bolsa_familia", columnDefinition = "bpchar")
  private String usuBolsaFamilia;

  @Column(name = "usu_transporte_publico", columnDefinition = "bpchar")
  private String usuTransportePublico;

  @Column(name = "usu_cert_civil_emissor")
  private String usuCertCivilEmissor;

  @Column(name = "usu_nis")
  private String usuNis;

  @Column(name = "usu_data_cad")
  @Temporal(TemporalType.DATE)
  private Date usuDataCad;

  @Column(name = "usu_qtd_comodos", columnDefinition = "int8")
  private Integer usuQtdComodos;

  @Column(name = "usu_prontuario_num", columnDefinition = "int8")
  private Integer usuProntuarioNum;

  @Column(name = "usu_cert_cartorio_nasc")
  private String usuCertCartorioNasc;

  @Column(name = "usu_cert_livro_nasc")
  private String usuCertLivroNasc;

  @Column(name = "usu_cert_lv_fls_nasc")
  private String usuCertLvFlsNasc;

  @Column(name = "usu_cert_termo_nasc")
  private String usuCertTermoNasc;

  @Column(name = "usu_gestor", columnDefinition = "bpchar")
  private String usuGestor;

  @Column(name = "codigo_secretaria")
  private Integer codigoSecretaria;

  @Column(name = "pais_codigo")
  private String paisCodigo;

  @Column(name = "usu_codigo_sus")
  private String usuCodigoSus;

  @Column(name = "usu_dt_obito")
  @Temporal(TemporalType.DATE)
  private Date usuDtObito;

  @Column(name = "usu_obito", columnDefinition = "bpchar")
  private String usuObito;

  @Column(name = "usu_uf_cert_civil")
  private String usuUfCertCivil;

  @Column(name = "uf_sigla_rg")
  private String ufSiglaRg;

  @Column(name = "uf_sigla_ctps")
  private String ufSiglaCtps;

  @Column(name = "usu_ativacao")
  private String usuAtivacao;

  @Column(name = "usu_dt_ativacao_desativacao")
  @Temporal(TemporalType.DATE)
  private Date usuDtAtivacaoDesativacao;

  @Column(name = "usu_cert_emissao_nasc")
  @Temporal(TemporalType.DATE)
  private Date usuCertEmissaoNasc;

  @Column(name = "usu_tipo_esgoto")
  private String usuTipoEsgoto;

  @Column(name = "usu_tipo_const_casa")
  private String usuTipoConstCasa;

  @Column(name = "usu_rede_eletrica")
  private String usuRedeEletrica;

  @Column(name = "usu_tipo_abast_agua")
  private String usuTipoAbastAgua;

  @Column(name = "usu_cbo_r")
  private String usuCboR;

  @Column(name = "usu_cert_lv_fls")
  private String usuCertLvFls;

  @Column(name = "usu_codigo_pai")
  private Integer usuCodigoPai;

  @Column(name = "usu_codigo_mae")
  private Integer usuCodigoMae;

  @Column(name = "usu_codigo_conjuge")
  private Integer usuCodigoConjuge;

  @Column(name = "usu_codigo_enc")
  private String usuCodigoEnc;

  @Column(name = "usu_codigo_ver")
  private String usuCodigoVer;

  @Column(name = "ecd_codigo")
  private String ecdCodigo;

  @Column(name = "dom_codigo")
  private Long domCodigo;

  @Column(name = "usu_plano_saude", columnDefinition = "bpchar")
  private String usuPlanoSaude;

  @Column(name = "usu_desc_plano_saude")
  private String usuDescPlanoSaude;

  @Column(name = "etn_codigo")
  private Long etnCodigo;

  @Column(name = "usu_fator_rh", columnDefinition = "bpchar")
  private String usuFatorRh;

  @Column(name = "usu_tipo_sanguineo", columnDefinition = "bpchar")
  private String usuTipoSanguineo;

  @Column(name = "usu_rg_emissor")
  private String usuRgEmissor;

  @Column(name = "usu_bloqueado")
  private Boolean usuBloqueado = false;

  @Column(name = "uni_codigo_obito")
  private Long uniCodigoObito;

  @Column(name = "cd10_codigo_obito")
  private Long cd10CodigoObito;

  @Column(name = "usu_nome_resp", columnDefinition = "bpchar")
  private String usuNomeResp;

  @Column(name = "usu_importacao")
  private String usuImportacao;

  @ManyToOne
  @JoinColumn(name = "usr_codigo")
  private Usuarios usuarios;

  @Column(name = "idbio")
  private Integer idbio;

  @Column(name = "usu_chefe")
  private String usuChefe;

  @Column(name = "usu_st_responsavel_familiar", columnDefinition = "bpchar")
  private String usuStResponsavelFamiliar;

  @Column(name = "usu_cns_responsavel_familiar")
  private String usuCnsResponsavelFamiliar;

  @Column(name = "uni_codigo")
  private Long uniCodigo;

  @Column(name = "estc_codigo")
  private String estcCodigo;

  @Column(name = "usu_as_aposentado")
  private Boolean usuAsAposentado;

  @Column(name = "usu_as_bpc")
  private Boolean usuAsBpc;

  @Column(name = "usu_asdeficiencia")
  private Boolean usuAsdeficiencia;

  @Column(name = "usu_asdoc_cnprov")
  private String usuAsdocCnprov;

  @Column(name = "usu_asdoc_rgprov")
  private String usuAsdocRgprov;

  @Column(name = "usu_asdoc_ctpsprov")
  private String usuAsdocCtpsprov;

  @Column(name = "usu_asdoc_cpfprov")
  private String usuAsdocCpfprov;

  @Column(name = "usu_asdoc_teprov")
  private String usuAsdocTeprov;

  @Column(name = "usu_as_apelido")
  private String usuAsApelido;

  @Column(name = "usu_asps_ativo")
  private Boolean usuAspsAtivo;

  @Column(name = "usu_asps_ref")
  private Boolean usuAspsRef;

  @Column(name = "as_usu_alfabetizado")
  private Boolean asUsuAlfabetizado;

  @Column(name = "as_usu_estuda")
  private Boolean asUsuEstuda;

  @Column(name = "as_usu_escolaridade")
  private Integer asUsuEscolaridade;

  @Column(name = "as_cond_ocupacao")
  private Integer asCondOcupacao;

  @Column(name = "as_possui_qualificacao")
  private Boolean asPossuiQualificacao;

  @Column(name = "as_possui_qualificacao_qual")
  private String asPossuiQualificacaoQual;

  @Column(name = "as_renda_mensal", columnDefinition = "numeric(20,2)")
  private Double asRendaMensal;

  @Column(name = "usu_as_tipo_deficiencia")
  private Integer usuAsTipoDeficiencia;

  @Column(name = "usu_as_cuidado_constante")
  private Boolean usuAsCuidadoConstante;

  @Column(name = "usu_as_resp_cuidado")
  private String usuAsRespCuidado;

  @Column(name = "usu_as_doenca_grava")
  private Boolean usuAsDoencaGrava;

  @Column(name = "usu_as_remedio_controlado")
  private Boolean usuAsRemedioControlado;

  @Column(name = "usu_as_alcoolatra")
  private Boolean usuAsAlcoolatra;

  @Column(name = "usu_as_drogado")
  private Boolean usuAsDrogado;

  @Column(name = "usu_as_situacao")
  private Boolean usuAsSituacao;

  @Column(name = "usu_sit_rua")
  private String usuSitRua;

  @Column(name = "usu_deficiencia")
  private Boolean usuDeficiencia;

  @Column(name = "usu_recado")
  private String usuRecado;

  @Column(name = "aspsu_parentesco")
  private Integer aspsuParentesco;

  @Column(name = "usu_tem_diabete")
  private Boolean usuTemDiabete;

  @Column(name = "usu_esta_gestante")
  private Boolean usuEstaGestante;

  @Column(name = "usu_tem_hipertensao")
  private Boolean usuTemHipertensao;

  @Column(name = "usu_filiacao")
  private String usuFiliacao;

  @Column(name = "usu_natural")
  private String usuNatural;

  @Column(name = "usu_situacao_renda")
  private String usuSituacaoRenda;

  @Column(name = "usu_fone_comercial")
  private String usuFoneComercial;

  @Column(name = "usu_endereco_comercial")
  private String usuEnderecoComercial;

  @Column(name = "usu_bairro_comercial")
  private String usuBairroComercial;

  @Column(name = "usu_complemento_comercial")
  private String usuComplementoComercial;

  @Column(name = "usu_municipio_comercial")
  private String usuMunicipioComercial;

  @Column(name = "usu_uf_comercial")
  private String usuUfComercial;

  @Column(name = "usu_tempo_servico")
  private String usuTempoServico;

  @Column(name = "epa_codigo")
  private Integer epaCodigo;

  @Column(name = "usu_origem_prontuario")
  private Boolean usuOrigemProntuario;

  @Column(name = "usu_nome_social")
  private String usuNomeSocial;

  @Column(name = "risco_gestacao", columnDefinition = "bpchar")
  private String riscoGestacao;

  @Column(name = "risco_hipertensao", columnDefinition = "bpchar")
  private String riscoHipertensao;

  @Column(name = "risco_diabetes", columnDefinition = "bpchar")
  private String riscoDiabetes;

  @Column(name = "risco_idoso", columnDefinition = "bpchar")
  private String riscoIdoso;

  @Column(name = "risco_crianca", columnDefinition = "bpchar")
  private String riscoCrianca;

  @Column(name = "risco_odonto", columnDefinition = "bpchar")
  private String riscoOdonto;

  @Column(name = "risco_psico", columnDefinition = "bpchar")
  private String riscoPsico;

  @Column(name = "usu_mudanca_territorio")
  private String usuMudancaTerritorio;

  @Column(name = "usu_numero_do")
  private Integer usuNumeroDo;

  @Column(name = "usr_cadastro_codigo")
  private Integer usrCadastroCodigo;

  @Column(name = "uni_cadastro_codigo")
  private Integer uniCadastroCodigo;

  @Column(name = "usr_esp_codigo")
  private Integer usrEspCodigo;

  @Column(name = "usr_equipe_codigo")
  private Integer usrEquipeCodigo;

  @Column(name = "usu_microarea")
  private Integer usuMicroarea;

  @Column(name = "usu_maternidade_ref")
  private String usuMaternidadeRef;

  @Column(name = "usu_microarea_fa")
  private String usuMicroareaFa;

  @Column(name = "usu_recusa")
  private String usuRecusa;

  @Column(name = "usu_ate_dom_mod")
  private Integer usuAteDomMod;

  @Column(name = "bai_codigo_old")
  private Integer baiCodigoOld;

  @Column(name = "rua_codigo_old")
  private Integer ruaCodigoOld;

  @Column(name = "usu_codigo_agentic")
  private Integer usuCodigoAgentic;

  @Column(name = "usu_sera_Integrado")
  private Boolean usuSeraIntegrado;

  @Transient
  private Integer usuNumOrdem;

  public void setUsuNome(String usuNome) {
    this.usuNome = StringUtils.upperCase(usuNome);
  }

  public String getUsuNisCompare() {
    return Util.removerCaracteresEspeciais(usuNis);
  }

  public String getUsuCpfCompare() {
    return Util.removerCaracteresEspeciais(usuCpf);
  }

  public String getUsuNomeCompare() {
    return Util.removerCaracteresEspeciais(usuNome);
  }

  public String getUsuMaeCompare() {
    return Util.removerCaracteresEspeciais(usuMae);
  }

  @Override
  public boolean equals(Object o) {
    Usuario c = (Usuario) o;
    if (!Objects.equals(getUsuNisCompare(), c.getUsuNisCompare())) {
      if (!Objects.equals(getUsuCpfCompare(), c.getUsuCpfCompare())) {
        if (!Objects.equals(
          Objects.hash(getUsuNomeCompare(), getUsuMaeCompare(), usuDatanasc),
          Objects.hash(c.getUsuNomeCompare(), c.getUsuMaeCompare(), c.usuDatanasc)
        )) {
          return false;
        }
      }
    }
    return true;
  }
}
