package com.ejie.m62fb.model.tipos;

import java.io.Serializable;

import org.springframework.context.i18n.LocaleContextHolder;

import com.ejie.m62fb.utils.constants.AppConstantes;

/**
 * <p>
 * <code>AbstractTipoGenerico</code>
 * </p>
 * <p>
 * Guarda las descripciones de los posibles valores de cada c&oacute;digo
 * empleado en las dem&aacute;s tablas de la aplicaci&oacute;n
 * </p>
 * 
XXXX
 */
public abstract class AbstractTipoGenericoP28 implements Serializable {

	private static final long serialVersionUID = -4861029843156656602L;

	/**
	 * Numero del registro, que identifica una Tabla de Tipos concreta. Ejem:
	 * Combo con NUM_REGISTRO 131 nos devolvera los Tipos de Elementos
	 */
	protected long numRegistro;
	/**
	 * Valor del combo. Cada valor que puede tomar el c&oacute;digo cuyos
	 * valores se agrupan con un mismo <code>numRegistro</code>
	 */
	protected String codTabla;

	/**
	 * Descripci&oacute;n del Valor concreto del C&oacute;digo (COD_TABLA) en
	 * Castellano
	 */
	protected String descripcionEs;
	/**
	 * Descripci&oacute;n del Valor concreto del C&oacute;digo (COD_TABLA) en
	 * Euskera
	 */
	protected String descripcionEu;

	/**
	 * Constructor por defecto
	 */
	public AbstractTipoGenericoP28() {
		super();
	}

	/**
	 * Constructor con el valor
	 * 
	 * @param numRegistro
	 *            N&uacute;mero de Registro que identifica el Tipo de la clase.
	 */
	public AbstractTipoGenericoP28(final long numRegistro) {
		super();
		this.numRegistro = numRegistro;
	}

	/**
	 * Constructor
	 * 
	 * @param codTabla
	 *            String
	 * @param descripcionEs
	 *            String
	 * @param descripcionEu
	 *            String
	 */
	public AbstractTipoGenericoP28(String codTabla, String descripcionEs,
			String descripcionEu) {
		super();
		this.codTabla = codTabla;
		this.descripcionEs = descripcionEs;
		this.descripcionEu = descripcionEu;
	}

	/**
	 * Constructor para crear un filtro solo por Id.
	 * 
	 * @param numRegistro
	 *            long
	 * @param codTabla
	 *            String
	 */
	public AbstractTipoGenericoP28(final long numRegistro, final String codTabla) {
		super();
		this.codTabla = codTabla;
		this.numRegistro = numRegistro;
	}

	/**
	 * Constructor con los atributos del tipo
	 * 
	 * @param numRegistro
	 *            N&uacute;mero de Registro
	 * @param codTabla
	 *            Valor del combo
	 * @param descripcionEs
	 *            Descripci&oacute;n en Castellano
	 * @param descripcionEu
	 *            Descripci&oacute;n en Euskera
	 */
	public AbstractTipoGenericoP28(final long numRegistro,
			final String codTabla, final String descripcionEs,
			final String descripcionEu) {
		super();
		this.codTabla = codTabla;
		this.numRegistro = numRegistro;
		this.descripcionEs = descripcionEs;
		this.descripcionEu = descripcionEu;
	}

	/**
	 * Method 'getNumRegistro'
	 * 
	 * @return numRegistro
	 */
	public long getNumRegistro() {
		return this.numRegistro;
	}

	/**
	 * Method 'setNumRegistro'
	 * 
	 * @param numRegistro
	 *            long
	 */
	public void setNumRegistro(long numRegistro) {
		this.numRegistro = numRegistro;
	}

	/**
	 * Method 'getCodTabla'
	 * 
	 * @return codTabla
	 */
	public String getCodTabla() {
		return this.codTabla;
	}

	/**
	 * Method 'setCodTabla'
	 * 
	 * @param codTabla
	 *            String
	 */
	public void setCodTabla(String codTabla) {
		this.codTabla = codTabla;
	}

	/**
	 * Method 'getDescripcionEs'
	 * 
	 * @return descripcionEs
	 */
	public String getDescripcionEs() {
		return this.descripcionEs;
	}

	/**
	 * Method 'setDescripcionEs'
	 * 
	 * @param descripcionEs
	 *            String
	 */
	public void setDescripcionEs(String descripcionEs) {
		this.descripcionEs = descripcionEs;
	}

	/**
	 * Method 'getDescripcionEu'
	 * 
	 * @return descripcionEu
	 */
	public String getDescripcionEu() {
		return this.descripcionEu;
	}

	/**
	 * Method 'setDescripcionEu'
	 * 
	 * @param descripcionEu
	 *            String
	 */
	public void setDescripcionEu(String descripcionEu) {
		this.descripcionEu = descripcionEu;
	}

	/**
	 * Method 'getDescripcion'. Devuelve la descripcion en el idioma actual.
	 * 
	 * @return String
	 */
	public String getDescripcion() {
		if (AppConstantes.EU.equals(LocaleContextHolder.getLocale()
				.getLanguage())) {
			return this.descripcionEu;
		} else {
			return this.descripcionEs;
		}
	}

	/**
	 * Method 'getCodDesc'. Devuelve el codigo junto con la descripcion en el
	 * idioma actual.
	 * 
	 * @return String
	 */
	public String getCodDescripcion() {
		StringBuilder resultado = new StringBuilder();
		if (this.getCodTabla() != null) {
			resultado.append(this.getCodTabla());
			resultado.append("-");
		}
		if (this.getDescripcion() != null) {
			resultado.append(this.getDescripcion());
		}
		return resultado.toString();
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#hashCode()
	 */
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((codTabla == null) ? 0 : codTabla.hashCode());
		return result;
	}

	/*
	 * (non-Javadoc)
	 * 
	 * @see java.lang.Object#equals(java.lang.Object)
	 */
	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		AbstractTipoGenericoP28 other = (AbstractTipoGenericoP28) obj;
		if (codTabla == null) {
			if (other.codTabla != null)
				return false;
		} else if (!codTabla.equals(other.codTabla))
			return false;
		return true;
	}
}