package com.ejie.ab79.model.REST.servicioWeb;

import java.io.Serializable;

import com.ejie.ab79.comun.Constantes;
import com.ejie.ab79.exceptions.Ab79Exception;
import com.fasterxml.jackson.annotation.JsonInclude;
import com.fasterxml.jackson.annotation.JsonInclude.Include;

/**
 * Clase que sirve por defecto para responder a una llamada del servicio REST.
 * 
 * IMPORTANTE: Todos los controladores que respondan con un JSON deben tener la
 * etiqueta "produces = MediaType.APPLICATION_JSON_VALUE" en la cabecera del
 * método o "produces = Constantes.APPLICATION_JSON_UTF8_VALUE" para que se
 * envíen correctamente los caracteres especiales.
 */
public class GenericResponse implements Serializable {
	private static final long serialVersionUID = 1L;

	@JsonInclude(Include.NON_NULL)
	private Integer estado;

	@JsonInclude(Include.NON_NULL)
	private String codigo;

	@JsonInclude(Include.NON_NULL)
	private String mensajeCastellano;

	@JsonInclude(Include.NON_NULL)
	private String mensajeEuskera;

	@JsonInclude(Include.NON_NULL)
	private GenericResponse[] lista;

	/**
	 * Constructor genérico.
	 */
	public GenericResponse() {
	}

	/**
	 * Respuesta genérica que se devolverá como JSON al cliente.
	 * 
	 * @param estado
	 *            Integer
	 * @param codigo
	 *            String
	 * @param mensajeCastellano
	 *            String
	 * @param mensajeEuskera
	 *            String
	 */
	public GenericResponse(Integer estado, String codigo, String mensajeCastellano, String mensajeEuskera) {
		this.estado = estado;
		this.codigo = codigo;
		this.mensajeCastellano = mensajeCastellano;
		this.mensajeEuskera = mensajeEuskera;
	}

	/**
	 * Respuesta genérica que se devolverá como JSON al cliente.
	 * 
	 * @param excepcion
	 *            Exception
	 */
	public GenericResponse(Exception excepcion) {
		this.estado = Constantes.ENVIO_JSON_ESTADO_ERROR;

		if (excepcion.getClass() == Ab79Exception.class) {
			this.codigo = ((Ab79Exception) excepcion).getFaultInfo().getCodigo();
			this.mensajeCastellano = ((Ab79Exception) excepcion).getFaultInfo().getMensajeCastellano();
			this.mensajeEuskera = ((Ab79Exception) excepcion).getFaultInfo().getMensajeEuskera();
		} else {
			this.codigo = "error.errorNoControlado";
			this.mensajeCastellano = excepcion.getMessage();
			this.mensajeEuskera = excepcion.getMessage();
		}
	}

	/**
	 * @return the estado
	 */
	public Integer getEstado() {
		return estado;
	}

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

	/**
	 * @return the codigo
	 */
	public String getCodigo() {
		return codigo;
	}

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

	/**
	 * @return the mensajeCastellano
	 */
	public String getMensajeCastellano() {
		return mensajeCastellano;
	}

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

	/**
	 * @return the mensajeEuskera
	 */
	public String getMensajeEuskera() {
		return mensajeEuskera;
	}

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

	/**
	 * @return the lista
	 */
	public GenericResponse[] getLista() {
		return lista;
	}

	/**
	 * @param lista
	 *            the lista to set
	 */
	public void setLista(GenericResponse[] lista) {
		this.lista = lista;
	}
}
