package com.FitBank.web.servlet;

import com.FitBank.web.util.EjecutarEventos;
import com.FitBank.xml.Mensaje.Bloque;
import com.FitBank.xml.Mensaje.Campo;
import com.FitBank.xml.Mensaje.Criterio;
import com.FitBank.xml.Mensaje.DatoGeneral;
import com.FitBank.xml.Mensaje.MensajeXml;

import java.util.Vector;

/**
 * Servlet utilizado por el notificador. Devuelve un XML que NO estï¿½ en el
 * formato FITBANK estï¿½ndar. Este XML es descargado a travï¿½s de AJAX por el
 * notificador, y mediante el int�rprete XML DOM incluido en todo web browser
 * actual lee las notificaciones y las despliega al usuario.
 * 
 * @author FitBank BC
 * @version 1.0 Enero 2006
 */
public class Notificador extends BaseServlets {
	protected void inicializar() {
		aceptarGet();
		aceptarPost();
		verificarSesion();
	}

	public void procesarPedido() {
		if (pedido.getParameter("consNotif") != null
				&& pedido.getParameter("consNotif").equals("true"))
			consultarNotificaciones();
		else if (pedido.getParameter("procNotif") != null)
			mantenimientoNotificacion();
		else if (pedido.getParameter("genNotif") != null
				&& pedido.getParameter("genNotif").equals("true"))
			generarNotificacion();
	}

	/**
	 * Consulta las notificaciones pendientes, y aquellas que ya han sido
	 * procesadas en el curso del dï¿½a actual. Devuelve al cliente un documento
	 * XML que no estï¿½ en el formato FITBANK estï¿½ndar, y que es interpretado a
	 * trav�s del web browser para mostrar las notificaciones al usuario.
	 */
	private void consultarNotificaciones() {
		EjecutarEventos eventoNt = new EjecutarEventos();

		eventoNt.procesoXml.getXmlMensaje().setEncabezado(copyEncabezado());

		eventoNt.ejecutarConsulta(pedido);

		String xml = generateXMLNotif(eventoNt);

		respuesta.setContentType("text/xml; charset=iso-8859-1");
		obtenerWriter();
		writer.print(xml);
		writer.close();
	}

	/**
	 * Inserta o actualiza una notificaci�n seg�n los par�metros enviados.
	 */
	private void mantenimientoNotificacion() {
		EjecutarEventos eventoNt = new EjecutarEventos();
		eventoNt.procesoXml.getXmlMensaje().setEncabezado(copyEncabezado());

		eventoNt.ejecutarMantenimiento(pedido, false);

		obtenerWriter();
		writer.print("Notificacion insertada exitosamente");
		writer.close();
	}

	/**
	 * Genera una notificaciï¿½n a partir de la captura de un error.
	 */
	private void generarNotificacion() {
		String codErr = pedido.getParameter("codErr");
		String[] ntfVals = null;
		Vector aut = evento.procesoXml.getXmlMensaje().autorizaciones;

		for (int i = 0; i < aut.size(); i++) {
			if (aut.elementAt(i) != null
					&& (aut.elementAt(i) instanceof DatoGeneral)) {
				DatoGeneral dtg = (DatoGeneral) aut.elementAt(i);

				if (dtg.getNombre().equals("NTF")) {
					String notStr = dtg.getValor();
					String[] vals = notStr.split("\\|");

					if (vals[1].equals(codErr)) {
						ntfVals = vals;
						break;
					}
				}
			}
		}

		evento.procesoXml.getXmlMensaje().borrarObjeto("NTF",
				MensajeXml.SEC_AUT);

		String toRet = "new Array('" + ntfVals[0] + "', '" + ntfVals[1]
				+ "', '" + ntfVals[2] + "', '" + ntfVals[3] + "', '"
				+ ntfVals[4] + "', '" + ntfVals[5] + "')";

		obtenerWriter();
		writer.println(toRet);
		writer.close();
	}

	/**
	 * Copia el encabezado del evento principal, sin las referencias a
	 * subsistema, transacci�n y versi�n, para no alterarlos en manipulaciones
	 * posteriores.
	 * 
	 * @return un Vector con el encabezado del evento principal sin las
	 *         referencias a <SUB>, <TRN> y <VER>.
	 */
	private Vector copyEncabezado() {
		Vector newEnc = new Vector();
		Vector srcEnc = evento.procesoXml.getXmlMensaje().encabezado;

		for (int i = 0; i < srcEnc.size(); i++) {
			DatoGeneral dato = (DatoGeneral) srcEnc.elementAt(i);

			if (!dato.getNombre().equalsIgnoreCase("SUB")
					&& !dato.getNombre().equalsIgnoreCase("TRN")
					&& !dato.getNombre().equalsIgnoreCase("VER"))
				newEnc.add(dato);
		}

		return newEnc;
	}

	/**
	 * Procesa el evento de la consulta y genera un XML (que no estï¿½ en el
	 * formato FIT-BANK) con las notificaciones.
	 * 
	 * @param eventoNt
	 *            EjecutarEventos con el evento que contiene el mensaje de
	 *            respuesta
	 * @return un String con el XML de la lista de eventos.
	 */
	private String generateXMLNotif(EjecutarEventos eventoNt) {
		Bloque[] bloques = {
				//(Bloque) eventoNt.procesoXml.getXmlMensaje().detalle[0]
				//		.elementAt(1),
				(Bloque) eventoNt.procesoXml.getXmlMensaje().detalle[0]
						.elementAt(0) };

		// ////////Armado de documento XML con lista de
		// notificaciones///////////

		//String xml = "<?xml version=\"1.0\" encoding=\"UTF-8\"?><FITBANK><NOT><NOM>Prueba</NOM><SUB>00</SUB><TRN>0001</TRN><FNT>01-01-2007</FNT><VER>01</VER><PND>true</PND></NOT><NOT><NOM>Prueba 2</NOM><SUB>00</SUB><TRN>0999</TRN><FNT>02-02-2007</FNT><VER>01</VER><PND>true</PND></NOT></FITBANK>";
		String xml = "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" +
		      "<FITBANK>";
		String isEmpty = "<EMPTY>true</EMPTY>";

		for (int blqCnt = 0; blqCnt < bloques.length; blqCnt++) {
			if (bloques[blqCnt].getNroRegistros() >= 1) {
				isEmpty = "";
				for (int i = 0; i < bloques[blqCnt].size(); i++) {
					Object elemento = bloques[blqCnt].campos.elementAt(i);
				  if ((elemento instanceof Campo) && !(elemento instanceof Criterio)) {
						Campo cmp = (Campo) elemento;

						if (cmp.getNombre().equals("1231001"))
							xml += "<NOT>";
						else if (cmp.getNombre().equals("1231007"))
							xml += "<NOM>" + cmp.getValor() + "</NOM>";
						else if (cmp.getNombre().equals("1231002"))
							xml += "<SUB>" + cmp.getValor() + "</SUB>";
						else if (cmp.getNombre().equals("1231003"))
							xml += "<TRN>" + cmp.getValor() + "</TRN>";
						else if (cmp.getNombre().equals("1231005"))
							xml += "<FNT>" + cmp.getValor() + "</FNT>";
						else if (cmp.getNombre().equals("1231008"))
							xml += "<VER>" + cmp.getValor() + "</VER>";
						else if (cmp.getNombre().equals("1231006")) {
							xml += "<PND>";
							if (cmp.getValor().equals(""))
								xml += "true";
							else
								xml += "false";
							xml += "</PND></NOT>";
						}
					}
				}
			}
		}

		xml += isEmpty + "</FITBANK>";

		//System.out.println(xml); // Despliega XML a enviar al cliente

		return xml;
	}
}