package modelo;

import java.io.Serializable;
import java.util.Date;
import java.util.List;

import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToOne;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.persistence.Transient;
import javax.validation.constraints.NotNull;

import org.hibernate.validator.constraints.NotBlank;
import org.hibernate.validator.constraints.br.CNPJ;
import org.hibernate.validator.constraints.br.CPF;


@Entity(name = "parceiro_negocio")
public class ParceiroNegocio implements Serializable {

	private static final long serialVersionUID = 1L;

	@Id
	@GeneratedValue(strategy = GenerationType.IDENTITY)
	private Long id;

	@NotBlank
	@Column(nullable = false, unique = true)
	private String nome;

	@Temporal(TemporalType.DATE)
	private Date dataNascimento;

	@Column(length = 20)
	private String rg;

	@Column(length = 10)
	private String orgaoEmissor;

	@Temporal(TemporalType.DATE)
	private Date dataExpedicao;

	@CPF
	private String cpf;

	@Column(length = 150)
	private String nomeMae;

	@Column(length = 150)
	private String nomePai;

	@NotBlank
	@Column(length = 150)
	private String email;
	
	@Column(length = 150)
	private String nomeFantasia;

	@CNPJ
	private String cnpj;

	@Column(length = 20)
	private String inscricaoMunicipal;

	@Column(length = 20)
	private String inscricaoEstadual;

	@Column(length = 20)
	private String suframa;

	@Column(length = 20)
	private String cep;
	
	@Column(length = 150)
	private String rua;

	@Column(length = 10)
	private String numero;

	@NotNull
	@Enumerated(EnumType.STRING)
	@Column(nullable = false)
	private EnumTipoPessoa tipoPessoa;
	
	@ElementCollection(fetch = FetchType.LAZY, targetClass = EnumTipoRelacionamento.class)
	@Enumerated(EnumType.STRING)
	@Column(nullable = false)
	private List<EnumTipoRelacionamento> tipoRelacionamento;
	
	@Enumerated(EnumType.STRING)
	@Column(nullable = false)
	private EnumEstadoCivil estadoCivil;

	@ManyToOne
	private Bairro bairro;
	
	@Column(length=50)
	private String telefone1;
	
	@Column(length=50)
	private String telefone2;
	
	@Column(length=50)
	private String telefone3;
	
	@Enumerated(EnumType.STRING)
	private EnumStatus status;

	@OneToOne(mappedBy = "parceiroNegocio", orphanRemoval = true)
	private Usuario usuario;

	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

	public Date getDataNascimento() {
		return dataNascimento;
	}

	public void setDataNascimento(Date dataNascimento) {
		this.dataNascimento = dataNascimento;
	}

	public String getRg() {
		return rg;
	}

	public void setRg(String rg) {
		this.rg = rg;
	}

	public String getOrgaoEmissor() {
		return orgaoEmissor;
	}

	public void setOrgaoEmissor(String orgaoEmissor) {
		this.orgaoEmissor = orgaoEmissor;
	}

	public Date getDataExpedicao() {
		return dataExpedicao;
	}

	public void setDataExpedicao(Date dataExpedicao) {
		this.dataExpedicao = dataExpedicao;
	}

	public String getCpf() {
		return cpf;
	}

	public void setCpf(String cpf) {
		this.cpf = cpf;
	}

	public String getNomeMae() {
		return nomeMae;
	}

	public void setNomeMae(String nomeMae) {
		this.nomeMae = nomeMae;
	}

	public String getNomePai() {
		return nomePai;
	}

	public void setNomePai(String nomePai) {
		this.nomePai = nomePai;
	}

	public String getEmail() {
		return email;
	}

	public void setEmail(String email) {
		this.email = email;
	}
	
	////////////////////////////////////
	//    Simulando Email para PJ     //
	////////////////////////////////////
	public String getEmailPJ() {
		return email;
	}

	public void setEmailPJ(String emailPJ) {
		if(TipoPessoaJuridica()) {
			this.email = emailPJ;
		}
	}

	public String getNomeFantasia() {
		return nomeFantasia;
	}

	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}

	public String getCnpj() {
		return cnpj;
	}

	public void setCnpj(String cnpj) {
		this.cnpj = cnpj;
	}

	public String getInscricaoMunicipal() {
		return inscricaoMunicipal;
	}

	public void setInscricaoMunicipal(String inscricaoMunicipal) {
		this.inscricaoMunicipal = inscricaoMunicipal;
	}

	public String getInscricaoEstadual() {
		return inscricaoEstadual;
	}

	public void setInscricaoEstadual(String inscricaoEstadual) {
		this.inscricaoEstadual = inscricaoEstadual;
	}

	public String getSuframa() {
		return suframa;
	}

	public void setSuframa(String suframa) {
		this.suframa = suframa;
	}

	public String getCep() {
		return cep;
	}

	public void setCep(String cep) {
		this.cep = cep;
	}

	public String getRua() {
		return rua;
	}

	public void setRua(String rua) {
		this.rua = rua;
	}

	public String getNumero() {
		return numero;
	}

	public void setNumero(String numero) {
		this.numero = numero;
	}

	public EnumTipoPessoa getTipoPessoa() {
		return tipoPessoa;
	}

	public void setTipoPessoa(EnumTipoPessoa tipoPessoa) {
		this.tipoPessoa = tipoPessoa;
	}	

	public List<EnumTipoRelacionamento> getTipoRelacionamento() {
		return tipoRelacionamento;
	}

	public void setTipoRelacionamento(List<EnumTipoRelacionamento> tipoRelacionamento) {
		this.tipoRelacionamento = tipoRelacionamento;
	}

	public EnumEstadoCivil getEstadoCivil() {
		return estadoCivil;
	}

	public void setEstadoCivil(EnumEstadoCivil estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	public Bairro getBairro() {
		return bairro;
	}

	public void setBairro(Bairro bairro) {
		this.bairro = bairro;
	}

	public String getTelefone1() {
		return telefone1;
	}

	public void setTelefone1(String telefone1) {
		this.telefone1 = telefone1;
	}

	public String getTelefone2() {
		return telefone2;
	}

	public void setTelefone2(String telefone2) {
		this.telefone2 = telefone2;
	}

	public String getTelefone3() {
		return telefone3;
	}

	public void setTelefone3(String telefone3) {
		this.telefone3 = telefone3;
	}

	public EnumStatus getStatus() {
		return status;
	}

	public void setStatus(EnumStatus status) {
		this.status = status;
	}

	public Usuario getUsuario() {
		return usuario;
	}

	public void setUsuario(Usuario usuario) {
		this.usuario = usuario;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + ((id == null) ? 0 : id.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		ParceiroNegocio other = (ParceiroNegocio) obj;
		if (id == null) {
			if (other.id != null)
				return false;
		} else if (!id.equals(other.id))
			return false;
		return true;
	}
	
	////////////////////////////////
	//		    Marcadores        //
	////////////////////////////////
	@Transient
	public boolean NovoCadastro() {
		return getId() == null;
	}
	
	@Transient
	public boolean isEditando() {
		return !this.NovoCadastro();
	}
	
	@Transient
	public boolean NaoEditando() {
		return !this.isEditando();
	}
	
	@Transient
	public boolean InformadoTipoPessoa() {
		return getTipoPessoa() != null;
	}
	
	@Transient
	public boolean TipoPessoaFisica() {
		return EnumTipoPessoa.FISICA.equals(getTipoPessoa());
	}
	
	@Transient
	public boolean TipoPessoaJuridica() {
		return EnumTipoPessoa.JURIDICA.equals(getTipoPessoa());
	}
	
	public String getCPFCNPJ() {
		String resultado = null;
		if (TipoPessoaFisica()) {
			resultado = getCpf();
		} else if (TipoPessoaJuridica()){
			resultado = getCnpj();
		}
		return resultado;
		
	}

}
