package com.ejie.ab39a.exception;

import java.io.IOException;
import java.util.List;

import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.springframework.context.support.ReloadableResourceBundleMessageSource;

import com.ejie.ab39a.exceptions.ErrorField;
import com.ejie.ab39a.exceptions.Mensaje;
import com.ejie.ab39a.utils.Utilidades;
import com.gfi.constants.Constants;
import com.gfi.utils.Utilities;

/**
 * ErroresViewHelper.
 * 
 *  
 */

public final class ErroresViewHelper {

	/**
	 * Constructor de ErroresViewHelper
	 */
	private ErroresViewHelper() {
	}

	/**
	 * Metodo que convierte una lista de ErrorField en la sálida a Formato html
	 * para su tratamiento por el FeedBack de Errores. Formato p.ej.:
	 * 
	 * //
	 * <ul class="rup-maint_feedbackUL">
	 * Se han producido los siguientes errores:<br>
	 * <li><b>DNI:</b>
	 * <ul>
	 * <li>El campo es obligatorio.</li>
	 * </ul>
	 * </li>
	 * </ul>
	 * 
	 * @param messageSource
	 *            mensajes messageSource
	 * @param errorFields
	 *            lista de errorField
	 * @return String String
	 */
	public static String obtenerErrorRup(ReloadableResourceBundleMessageSource messageSource,
			List<ErrorField> errorFields) {
		StringBuilder stb = new StringBuilder(Constants.STRING_BUILDER_INIT);
		if (!Utilities.isEmptyList(errorFields)) {
			// Generar Inicio
			stb.append("<ul class=\"rup-maint_feedbackUL\">");
			stb.append(Utilidades.getLiteralMessage(messageSource, "titulo.error"));
			stb.append("<br/>");
			boolean hayCampo = false;
			boolean esPrimerCampo;
			for (ErrorField errorField : errorFields) {
				hayCampo = false;
				if (errorField != null && errorField.getCampo() != null) {
					hayCampo = true;
					// Generar Campo
					stb.append("<li>").append("<b>");
					esPrimerCampo = true;
					for (String campo : errorField.getCampo()) {
						if (!esPrimerCampo) {
							stb.append(", ");
						}
						stb.append(Utilidades.getLiteralMessage(messageSource, campo));
						esPrimerCampo = false;
					}
					stb.append(":</b>");
				}
				boolean hayMensaje = false;
				for (Mensaje mensaje : errorField.getMensajes()) {
					// Generar Mensaje
					if (hayCampo && !hayMensaje) {
						stb.append("<ul>");
					}
					if (!hayCampo) {
						stb.append("<li>").append("<b>");
					} else {
						stb.append("<li>");
					}
					stb.append(mensaje.isTraducido() ? mensaje.getKey()
							: Utilidades.getLiteralMessageWithParams(messageSource, mensaje.getKey(),
									Utilidades.parseParametroKeyToObject(messageSource, mensaje.getParametrosKey())));
					if (!hayCampo) {
						stb.append("</b>");
						stb.append("</li>");
					} else {
						stb.append("</li>");
					}
					hayMensaje = true;
				}
				if (hayCampo && hayMensaje) {
					stb.append("</ul>");
				}
				if (hayCampo) {
					stb.append("</li>");
				}
			}
			stb.append("</ul>");
		}
		return stb.toString();
	}

	/**
	 * Metodo que construye la respuesta para llamadas desde IE para escribir en
	 * el textarea el resultado
	 * 
	 * @param request
	 *            HttpServletRequest request
	 * @param response
	 *            HttpServletResponse response
	 * @param introduceTextArea
	 *            boolean Indica si es necesario escribir el textarea. Caso
	 *            especial de subida máxima permitida superada.
	 * @param texto
	 *            String texto
	 * @throws IOException
	 *             e e
	 */
	public static void writeRdoIframe(HttpServletRequest request, HttpServletResponse response,
			boolean introduceTextArea, String texto) throws IOException {
		ServletOutputStream outputStream = response.getOutputStream();
		if (introduceTextArea) {
			response.setStatus(HttpServletResponse.SC_OK);
		} else {
			response.setStatus(HttpServletResponse.SC_NOT_ACCEPTABLE);
		}
		response.setContentType("text/plain");
		response.setCharacterEncoding(Constants.UTF8);
		if (introduceTextArea) {
			outputStream.write("<textarea status='406' statusText=''>".getBytes(Constants.UTF8));
		}
		outputStream.write(texto.getBytes(Constants.UTF8));
		if (introduceTextArea) {
			outputStream.write("</textarea>".getBytes(Constants.UTF8));
		}
		outputStream.flush();
		outputStream.close();

		response.flushBuffer();
	}
}
