package com.ejie.ad74a.exceptions;

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

/**
 * Clase que encapsula la informacion para las excepciones controladas
 * 
 * @author GFI
 */
public class ValidatorException extends Ad74aException implements Serializable {

	private static final long serialVersionUID = 1L;

	private final List<ErrorField> errorsFields;

	/**
	 * Constructor 'ValidatorException'
	 * 
	 * @param tiles   {@link String}
	 * @param campo   {@link String}
	 * @param mensaje {@link String}
	 * @param param   {@link String}
	 */
	public ValidatorException(String tiles, String campo, String mensaje, String param) {
		super("ValidatorException");

		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(campo, mensaje, param));
	}

	/**
	 * Constructor 'ValidatorException'
	 * 
	 * @param tiles      {@link String}
	 * @param campo      {@link String}
	 * @param mensaje    {@link String}
	 * @param param      {@link String}
	 * @param paramIsKey {@link boolean}
	 */
	public ValidatorException(String tiles, String campo, String mensaje, String param, boolean paramIsKey) {
		super("ValidatorException");

		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(campo, mensaje, paramIsKey, param));
	}

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

	/**
	 * Constructor 'ValidatorException'
	 * 
	 * @param errorsFields {@link List}<ErrorField>
	 */
	public ValidatorException(List<ErrorField> errorsFields) {
		super("ValidatorException");
		this.errorsFields = errorsFields;
	}

	/**
	 * Constructor 'ValidatorException'
	 * 
	 * @param generaTextArea boolean true si hay que generar
	 * @param errorsFields   {@link List}<ErrorField>
	 */
	public ValidatorException(boolean generaTextArea, List<ErrorField> errorsFields) {
		super("ValidatorException");
		this.errorsFields = errorsFields;
	}

	/**
	 * 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 ValidatorException(String mensajeCode, Throwable cause) {
		super(cause, "ValidatorException");
		this.errorsFields = new ArrayList<ErrorField>();
		this.errorsFields.add(new ErrorField(mensajeCode));
	}

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

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

}
