package com.ejie.m62fb.model.persona;

import java.io.Serializable;
import java.math.BigDecimal;
import java.util.Date;

import org.codehaus.jackson.map.annotate.JsonDeserialize;
import org.codehaus.jackson.map.annotate.JsonSerialize;

import com.ejie.m62fb.model.base.AbstractM62FBModel;
import com.ejie.m62fb.model.direccion.Direccion;
import com.ejie.m62fb.model.tipos.TipoClave;
import com.ejie.m62fb.model.tipos.TipoEstadoCivil;
import com.ejie.m62fb.model.tipos.TipoSexo;
import com.ejie.t17i.model.Pais;
import com.ejie.x38.serialization.JsonDateDeserializer;
import com.ejie.x38.serialization.JsonDateSerializer;

/**
 * 
XXXX
 * 
 */
public class Persona extends AbstractM62FBModel implements Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 6649865152724017537L;

	// Clave compuesta por id y version
	/** Identificador &uacute;nico de la persona */
	private BigDecimal idPersona;
	/** Tipo de identificador (deberia ser un TIPO no un String */
	private TipoClave tipoCodigoId;
	/** Id del c&oacute;digo */
	private String codigoId;
	/** numCorrelNif */
	private Integer numCorrelNif;
	/** Nombre de la persona */
	private String nombre;
	/** Apellido 1 de la persona */
	private String apellido1;
	/** Apellido 2 de la persona */
	private String apellido2;
	/** Direcci&oacute;n de la persona */
    private Direccion direccion;
    /**fecha de nacimiento*/
    private Date fecNacimiento;
    private TipoSexo sexo;
    private TipoEstadoCivil estadoCivil;
    private Pais nacionalidad;
    private String email;
    private String telefno1;
    private String telefno2;
    private boolean bFiltroLupa;
	/** Datos de contacto */

	public boolean isbFiltroLupa() {
		return bFiltroLupa;
	}

	public void setbFiltroLupa(boolean bFiltroLupa) {
		this.bFiltroLupa = bFiltroLupa;
	}

	/**
	 * Constructor por defecto
	 */
	public Persona() {
		super();
		this.bFiltroLupa=false;
	}

	/**
	 * Constructor con solo nombre y apellidos
	 * 
	 * @param nombre
	 *            Nombre de la persona
	 * @param apellido1
	 *            Apellido 1 de la persona
	 * @param apellido2
	 *            Apellido 2 de la persona
	 */
	public Persona(String nombre, String apellido1, String apellido2) {
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;
	}
	
	/**
	 * Constructor con nombre, apellidos, nif e idPersona
	 * 
	 * @param idPersona
	 *            Id de la persona
	 * @param nombre
	 *            Nombre de la persona
	 * @param apellido1
	 *            Apellido 1 de la persona
	 * @param apellido2
	 *            Apellido 2 de la persona
	 * @param nifTitular
	 *            Nif de la persona
	 *            
	 */
	public Persona(BigDecimal idPersona, String nombre, String apellido1, String apellido2) {
		this.idPersona = idPersona;
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;
	}

	/**
	 * Constructor para crear un filtro solo por Id.
	 * 
	 * @param id
	 *            Identificador &uacute;nico de la persona
	 */
	public Persona(BigDecimal id) {
		super();
		this.idPersona = id;
	}

	/**
	 * Constructor para datos b&aacute;sicos de un Adjudicatario.
	 * 
	 */
	public Persona(BigDecimal id, TipoClave tipoCodigoId, String codigoId,
			String nombre) {
		super();
		this.idPersona = id;
		this.tipoCodigoId = tipoCodigoId;
		this.codigoId = codigoId;
		this.nombre = nombre;
	}

	/**
	 * @param tipoCodigoId
	 *            Tipo de identificador
	 * @param codigoId
	 *            Id del c&oacute;digo
	 * @param nombre
	 *            Nombre de la persona
	 * @param apellido1
	 *            Apellido 1 de la persona
	 * @param apellido2
	 *            Apellido 2 de la persona
	 * @param id
	 *            Identificador &uacute;nico de la persona
	 * @param version
	 *            Versi&oacute;n de la persona
	 * @param datosContacto
	 *            Datos de Contacto de la persona
	 */
	public Persona(TipoClave tipoCodigoId, String codigoId, String nombre,
			String apellido1, String apellido2, BigDecimal id) {
		this.idPersona = id;
		this.tipoCodigoId = tipoCodigoId;
		this.codigoId = codigoId;
		this.nombre = nombre;
		this.apellido1 = apellido1;
		this.apellido2 = apellido2;

	}

	/**
	 * Devuelve el identificador &uacute;nico de la persona
	 * 
	 * @return Identificador &uacute;nico de la persona
	 */
	public BigDecimal getIdPersona() {
		return this.idPersona;
	}

	/**
	 * Establece el identificador &uacute;nico de la persona
	 * 
	 * @param id
	 *            Identificador &uacute;nico de la persona
	 */
	public void setIdPersona(BigDecimal idPersona) {
		this.idPersona = idPersona;
	}

	/**
	 * Devuelve el tipo de identificador de la persona
	 * 
	 * @return Tipo de identificador
	 */
	public TipoClave getTipoCodigoId() {
		return this.tipoCodigoId;
	}

	/**
	 * Establece el tipo de identificador de la persona
	 * 
	 * @param tipoCodigoId
	 *            Tipo de identificador
	 */
	public void setTipoCodigoId(TipoClave tipoCodigoId) {
		this.tipoCodigoId = tipoCodigoId;
	}

	/**
	 * Devuelve el Id del c&oacute;digo de la persona
	 * 
	 * @return Id del c&oacute;digo
	 */
	public String getCodigoId() {
		return this.codigoId;
	}

	/**
	 * Establece el Id del c&oacute;digo de la persona
	 * 
	 * @param codigoId
	 *            Id del c&oacute;digo
	 */
	public void setCodigoId(String codigoId) {
		this.codigoId = codigoId;
		;
	}

	/**
	 * Devuelve el nombre de la persona
	 * 
	 * @return Nombre
	 */
	public String getNombre() {
		return this.nombre;
	}

	/**
	 * Establece el nombre de la persona
	 * 
	 * @param nombre
	 *            Nombre
	 */
	public void setNombre(String nombre) {
		this.nombre = nombre;
	}

	/**
	 * Devuelve el apellido 1 de la persona
	 * 
	 * @return Apellido 1
	 */
	public String getApellido1() {
		return this.apellido1;
	}

	/**
	 * Establece el apellido 1 de la persona
	 * 
	 * @param apellido1
	 *            Apellido 1
	 */
	public void setApellido1(String apellido1) {
		this.apellido1 = apellido1;
	}

	/**
	 * Devuelve el apellido 2 de la persona
	 * 
	 * @return Apellido 2
	 */
	public String getApellido2() {
		return this.apellido2;
	}

	/**
	 * Establece el apellido 2 de la persona
	 * 
	 * @param apellido2
	 *            Apellido 2
	 */
	public void setApellido2(String apellido2) {
		this.apellido2 = apellido2;
	}

	/**
	 * Devuelve el nombre completo
	 * 
	 * @return Nombre completo de la persona
	 */
	public String getNombreCompleto() {
		StringBuffer nombreCompleto = new StringBuffer();
		if (this.nombre != null) {
			nombreCompleto.append(this.nombre);
		}
		if (this.apellido1 != null) {
			nombreCompleto.append(nombreCompleto.length()>0?" ":"").append(this.apellido1);
		}
		if (this.apellido2 != null) {
			nombreCompleto.append(nombreCompleto.length()>0?" ":"").append(this.apellido2);
		}
		return nombreCompleto.toString();

	}

	/**
	 * Devuelve el nombre completo
	 * 
	 * @return Nombre completo de la persona
	 */
	public String getApellidosNombre() {
		StringBuffer nombreCompleto = new StringBuffer();

		if (this.apellido1 != null) {
			nombreCompleto.append(this.apellido1);
		}
		if (this.apellido2 != null) {
			nombreCompleto.append(nombreCompleto.length()>0?" ":"").append(this.apellido2);
		}
		if (this.nombre != null) {
			nombreCompleto.append(nombreCompleto.length()>0?", ":"").append(this.nombre);
		}
		return nombreCompleto.toString();

	}

	/**
	 * @param direccion the direccion to set
	 */
	public void setDireccion(Direccion direccion) {
		this.direccion = direccion;
	}

	/**
	 * @return the numCorrelNif
	 */
	public Integer getNumCorrelNif() {
		return numCorrelNif;
	}

	/**
	 * @param numCorrelNif the numCorrelNif to set
	 */
	public void setNumCorrelNif(Integer numCorrelNif) {
		this.numCorrelNif = numCorrelNif;
	}

	/**
	 * @return the fecNacimiento
	 */
	@JsonSerialize(using = JsonDateSerializer.class)
	public Date getFecNacimiento() {
		return fecNacimiento;
	}

	/**
	 * @param fecNacimiento the fecNacimiento to set
	 */
	@JsonDeserialize(using = JsonDateDeserializer.class)
	public void setFecNacimiento(Date fecNacimiento) {
		this.fecNacimiento = fecNacimiento;
	}

	/**
	 * @return the sexo
	 */
	public TipoSexo getSexo() {
		return sexo;
	}

	/**
	 * @param sexo the sexo to set
	 */
	public void setSexo(TipoSexo sexo) {
		this.sexo = sexo;
	}

	/**
	 * @return the estadoCivil
	 */
	public TipoEstadoCivil getEstadoCivil() {
		return estadoCivil;
	}

	/**
	 * @param estadoCivil the estadoCivil to set
	 */
	public void setEstadoCivil(TipoEstadoCivil estadoCivil) {
		this.estadoCivil = estadoCivil;
	}

	/**
	 * @return the nacionalidad
	 */
	public Pais getNacionalidad() {
		return nacionalidad;
	}

	/**
	 * @param nacionalidad the nacionalidad to set
	 */
	public void setNacionalidad(Pais nacionalidad) {
		this.nacionalidad = nacionalidad;
	}

	/**
	 * @return the email
	 */
	public String getEmail() {
		return email;
	}

	/**
	 * @param email the email to set
	 */
	public void setEmail(String email) {
		this.email = email;
	}

	/**
	 * @return the telefno1
	 */
	public String getTelefno1() {
		return telefno1;
	}

	/**
	 * @param telefno1 the telefno1 to set
	 */
	public void setTelefno1(String telefno1) {
		this.telefno1 = telefno1;
	}

	/**
	 * @return the telefno2
	 */
	public String getTelefno2() {
		return telefno2;
	}

	/**
	 * @param telefno2 the telefno2 to set
	 */
	public void setTelefno2(String telefno2) {
		this.telefno2 = telefno2;
	}

	/**
	 * @return the direccion
	 */
	public Direccion getDireccion() {
		return direccion;
	}
}
