package com.ejie.ab39a.exceptions;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

/**
 * Clase que encapsula la informacion para las excepciones controladas
 * 
 *  
 */
public class ErrorGenericoException extends RuntimeException implements Serializable {

	private static final long serialVersionUID = 1L;

	private final List<ErrorField> errorsFields;

	// Tiles en la que mostrar el error
	private final String tiles;

	private final boolean generaTextArea;

	/**
	 * Constructor 'ErrorFieldsException'
	 * 
	 * @param tiles
	 *            String tiles
	 * @param campo
	 *            String campo
	 * @param mensaje
	 *            String mensaje
	 * @param param
	 *            String param
	 */
	public ErrorGenericoException(String tiles, String campo, String mensaje, String param) {
		super("ErrorGenericoException");
		this.tiles = tiles;
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(campo, mensaje, param));
		this.generaTextArea = false;
	}

	/**
	 * Constructor 'ErrorFieldsException'
	 * 
	 * @param tiles
	 *            String tiles
	 * @param campo
	 *            String campo
	 * @param mensaje
	 *            String mensaje
	 * @param param
	 *            String param
	 * @param paramIsKey
	 *            boolean paramIsKey
	 */
	public ErrorGenericoException(String tiles, String campo, String mensaje, String param, boolean paramIsKey) {
		super("ErrorGenericoException");
		this.tiles = tiles;
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(campo, mensaje, param, paramIsKey));
		this.generaTextArea = false;
	}

	/**
	 * Constructor 'ErrorFieldsException'
	 * 
	 * @param campo
	 *            String campo
	 * @param mensajeCode
	 *            String mensajeCode
	 */
	public ErrorGenericoException(String campo, String mensajeCode) {
		super("ErrorFieldsException");
		ErrorField ef = null;
		if (campo != null) {
			new ErrorField(campo, mensajeCode);
		} else {
			new ErrorField(mensajeCode);
		}
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(ef);
		this.tiles = null;
		this.generaTextArea = false;
	}

	/**
	 * Constructor 'ErrorFieldsException'
	 * 
	 * @param errorsFields
	 *            List<ErrorField> errorsFields
	 */
	public ErrorGenericoException(List<ErrorField> errorsFields) {
		super("ErrorGenericoException");
		this.errorsFields = errorsFields;
		this.tiles = null;
		this.generaTextArea = false;
	}

	/**
	 * Constructor 'ErrorFieldsException'
	 * 
	 * @param generaTextArea
	 *            boolean generaTextArea
	 * @param errorsFields
	 *            List<ErrorField> errorsFields
	 */
	public ErrorGenericoException(boolean generaTextArea, List<ErrorField> errorsFields) {
		super("ErrorGenericoException");
		this.errorsFields = errorsFields;
		this.generaTextArea = generaTextArea;
		this.tiles = null;
	}

	/**
	 * Constructor a utilizar por clases hijas, para mantener la traza completa
	 * del error, mas un mensaje descriptivo que mostrar al usuario.
	 * 
	 * @param mensajeCode
	 *            Codigo del literal que contiene el mensaje de error
	 * @param cause
	 *            Excepcion que ha producido el error
	 */
	public ErrorGenericoException(String mensajeCode, Throwable cause) {
		super("ErrorGenericoException", cause);
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(mensajeCode));
		this.tiles = null;
		this.generaTextArea = false;
	}

	/**
	 * Constructor a utilizar para describir el mensaje de error recuperado de
	 * un servicio externo
	 * 
	 * @param mensaje
	 *            de error obtenido de un servicio externo
	 */
	public ErrorGenericoException(String mensaje) {
		super(mensaje);
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(mensaje));
		this.tiles = null;
		this.generaTextArea = false;
	}

	/**
	 * Method 'getErrorsFields'.
	 * 
	 * @return List<ErrorField>
	 */
	public List<ErrorField> getErrorsFields() {
		return this.errorsFields;
	}

	/**
	 * Method 'getTiles'.
	 * 
	 * @return String
	 */
	public String getTiles() {
		return this.tiles;
	}

	/**
	 * Method 'isGeneraTextArea'.
	 * 
	 * @return boolean
	 */
	public boolean isGeneraTextArea() {
		return this.generaTextArea;
	}

}
