package com.FitBank.web.servlet;


import java.io.FileInputStream;

import com.FitBank.web.util.ConstruirContenido;
import com.FitBank.web.util.EjecutarEventos;
import com.FitBank.xml.Mensaje.MensajeXml;
import com.fitbank.common.properties.PropertiesHandler;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import org.apache.commons.lang.StringUtils;

/**
 * Servlet que incluye todos los procedimientos necesarios para escanear
 * imagenes, y guardar estas imagenes en la base de datos a traves del
 * Core. Los parametros indican que operacion se debe realizar. El parametro
 * "scan=1" permite realizar el escaneo en si, ademas se deben pasar los
 * parametros "topx", "topy", "wid", "hei", "res" y opcionalmente "docType".
 * Este ultimo, si se incluye, puede pasarsele los valores "doc" para
 * documentos, "fot" para fotos o "fir" para firmas (este valor sera traducido
 * como "D", "P" o "F" en el campo CTIPOIMAGEN en TIMAGENES. Una vez realizado el
 * escaneo, se puede mostrar la imagen mediante el parametro "img=1". Si se
 * desea la ventana de vista previa, pasar el parametro "prevWin=1". Si se
 * desea insertar la imagen en la base de datos, pasar el parametro
 * "insert=1". Una vez finalizadas todas las operaciones de escaneo, se
 * debe pasar el parametro "finish=1".
 *
 * @author FITBANK BC
 * @version 2.0 Julio del 2005
 */
public class Escanear extends BaseServlets
{
  protected void inicializar()
  {
    aceptarGet();
    aceptarPost();
    verificarSesion();
  }

  public void procesarPedido() {
    if(pedido.getParameter("scan") != null)
    {
      escanear();
    } else if (pedido.getParameter("del") != null)
    {
     borrarImagenDB();
    } else if (pedido.getParameter("save") != null)
    {
     guardarImagenDB();
    } else if (pedido.getParameter("img") != null)
    {
      mostrarImagenEscaneada();
    } else if (pedido.getParameter("prevWin") != null)
    {
      mostrarVentanaPreview();
    } else if (pedido.getParameter("insert") != null)
    {
     insertarImagenDB();
    } else if (pedido.getParameter("finish") != null)
    {
      finalizarEscan();
    }
  }

  /**
   * Procedimiento para escanear una imagen
   */
  private void escanear()
  {
	  EjecutarEventos eventoEs = new EjecutarEventos();
    eventoEs.procesoXml.getXmlMensaje().setEncabezado(evento.procesoXml.getXmlMensaje().encabezado);

    eventoEs.procesoXml.getXmlMensaje().setValor("NUM", pedido.getParameter("num"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("SEC", pedido.getParameter("sec"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("TOPX", pedido.getParameter("topx"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("TOPY", pedido.getParameter("topy"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("RES", pedido.getParameter("res"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("WID", pedido.getParameter("wid"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("HEI", pedido.getParameter("hei"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("UNID", pedido.getParameter("unid"), MensajeXml.SEC_CAB);
    eventoEs.procesoXml.getXmlMensaje().setValor("GUI", pedido.getParameter("showUI"), MensajeXml.SEC_CAB);


    eventoEs.ejecutarEscaneo(pedido);

   // mostrarImagenEscaneada();




    sesion.setAttribute("FBES", eventoEs);
    if (sesion.getAttribute("FBMX") == null)
      sesion.setAttribute("FBMX", pedido.getParameter("maxPag"));

    if (pedido.getParameter("docType") != null)
      sesion.setAttribute("FBTY", pedido.getParameter("docType"));
    try {
    	writer = this.respuesta.getWriter();
	} catch (Exception e) {
		e.printStackTrace();
	}
	writer.print("<src width='"+pedido.getParameter("wid")+"' height='"+pedido.getParameter("hei")+"'  src='FBSIM?totPag=1&num="+pedido.getParameter("num")+"+&img=pagina'>");
    writer.print("<script>");
    if(!pedido.getParameter("noi").equals(""))
      writer.print("parent.document.getElementById('" + pedido.getParameter("noi") + "').src='FBSES?img=si';");
    writer.print("parent.st('Finalizado escaneo.',false,0);");
    writer.print("alert('Proceso de Escaneo Finalizado');" +
    		"parent.open('FBSES?prevWin=si&nom=" +
      pedido.getParameter("nom") + "&noi=" + pedido.getParameter("noi") +
      "&num=" + pedido.getParameter("num") +
      "&mxp=" + ((String) sesion.getAttribute("FBMX")) + "',");
    writer.print("'', 'width=640,height=480,");
    writer.print("scrollbars=1,toolbar=0,location=0,menubar=0,status=1');");
    writer.print("</script>");
  }

  /**
   * Muestra la imagen que ha sido recientemente escaneada.
   */
  private void mostrarImagenEscaneada()
  {
   // EjecutarEventos eventoEs = (EjecutarEventos)sesion.getAttribute("FBES");


  //  Imagen im = (Imagen)eventoEs.procesoXml.getXmlMensaje().detalle[0].elementAt(0);
    try {
    	//System.out.println("num" +pedido.getParameter("num") +"sec" +pedido.getParameter("sec"));
    	PropertiesHandler ph=new PropertiesHandler("images");
    	int num = Integer.parseInt(pedido.getParameter("num"));
    	int sec = Integer.parseInt(pedido.getParameter("sec"));
    /*  OutputStream out = respuesta.getOutputStream();
      byte[] decod = im.decodificar();
      out.write(decod);
      out.close();*/
    	//System.out.println(ph.getStringValue("webapp.images.path")+"/IMG"+num+"_"+sec);
    	FileInputStream fin=new FileInputStream(ph.getStringValue("webapp.images.path")+"/IMG"+num+"_"+sec+"_TIMAGENES");
    	obtenerOutputStream("image/jpeg");
    	byte b[]=new byte[999];
    	int car=0;
    	do{
    		car=fin.read(b);
    		if(car>0){
          outputStream.write(b);
    		}
    	}while(car>0);
      outputStream.close();
      fin.close();
    } catch(Exception e) {
      e.printStackTrace();
      //Debug.imprimirError(e);
    }
  }

  /**
   * Muestra la ventana de vista previa.
   */
  private void mostrarVentanaPreview()
  {
    obtenerWriter();
    int pag = 1;
    int maxPag = 0;

    if (pedido.getParameter("mxp") != null)
      maxPag = Integer.parseInt(pedido.getParameter("mxp"));

    if (sesion.getAttribute("FBPG") != null)
      pag = ((Integer) sesion.getAttribute("FBPG")).intValue() + 1;

    writer.print(ConstruirContenido.ventanaPreviewEscaneo(
      pedido.getParameter("nom"), pedido.getParameter("noi"), Integer.parseInt(
      pedido.getParameter("num")), maxPag, pag));
  }

  /**
   * Inserta la imagen recientemente escaneada en la base de datos.
   */
  private void insertarImagenDB()
  {
    EjecutarEventos eventoEs = (EjecutarEventos) sesion.getAttribute("FBES");
    Integer raiz = (Integer) sesion.getAttribute("FBRZ");
    Integer pag = (Integer) sesion.getAttribute("FBPG");
    String docTyp = (String) sesion.getAttribute("FBTY");

    if (raiz == null) {
      eventoEs.procesoXml.getXmlMensaje().setValor("NUM", pedido.getParameter("num"), MensajeXml.SEC_CAB);
      sesion.setAttribute("FBRZ", new Integer(pedido.getParameter("num")));
    } else
      eventoEs.procesoXml.getXmlMensaje().setValor("NUM", raiz.toString(), MensajeXml.SEC_CAB);

    if (pag == null) {
      eventoEs.procesoXml.getXmlMensaje().setValor("SEC", "0", MensajeXml.SEC_CAB);
      pag = new Integer(0);
    } else
      eventoEs.procesoXml.getXmlMensaje().setValor("SEC", pag.toString(), MensajeXml.SEC_CAB);

    if (docTyp == null)
      eventoEs.procesoXml.getXmlMensaje().setValor("DOC", "D", MensajeXml.SEC_CAB);
    else
    {
      String dt = "";
      if (docTyp.equalsIgnoreCase("doc"))
        dt = "D";
      else if (docTyp.equalsIgnoreCase("fot"))
        dt = "T";
      else if (docTyp.equalsIgnoreCase("fir"))
        dt = "F";

      eventoEs.procesoXml.getXmlMensaje().setValor("DOC", dt, MensajeXml.SEC_CAB);
    }

    //Inserta la imagen en la base de datos a traves del Core.
    eventoEs.ejecutarInsercionImagen(pedido);

    //Si el proceso de insercion no fallo, asignar los atributos de sesion.
    pag = new Integer(pag.intValue() + 1);
    sesion.setAttribute("FBPG", pag);
  }

  public static class ImagenEscaneada {

      public String imagen, numero, pagina, tipo;

  }

  /**
   * Guarda la imagen recientemente escaneada en la sesion para ser mantenida despues.
   */
  private void guardarImagenDB()
  {
    if (sesion.getAttribute("FBES_IIM") == null) {
        sesion.setAttribute("FBES_IIM", new HashMap<String, ImagenEscaneada>());
    }

    ImagenEscaneada ie = new ImagenEscaneada();

    ie.imagen = pedido.getParameter("img");
    ie.numero = pedido.getParameter("num");
    ie.pagina = StringUtils.defaultIfEmpty(pedido.getParameter("sec"), "0");
    ie.tipo = StringUtils.defaultIfEmpty(pedido.getParameter("tipo"), "D");

    ((Map<String, ImagenEscaneada>) sesion.getAttribute("FBES_IIM")).put(ie.numero + "_" + ie.pagina, ie);

    obtenerWriter();
    writer.print("OK");
  }

  /**
   * Borra la imagen recientemente escaneada de la sesion.
   */
  private void borrarImagenDB()
  {
    if (sesion.getAttribute("FBES_IIM") != null) {
      Iterator<ImagenEscaneada> ies = ((Map<String, ImagenEscaneada>) sesion.getAttribute("FBES_IIM")).values().iterator();

      while (ies.hasNext()) {
        ImagenEscaneada ie = ies.next();
        if (ie.numero.equals(pedido.getParameter("num"))) {
          ies.remove();
        }
      }
    }

    obtenerWriter();
    writer.print("OK");
  }

  /**
   * Limpia los atributos de sesion utilizados para este escaneo.
   */
  private void finalizarEscan()
  {
    sesion.removeAttribute("FBRZ");
    sesion.removeAttribute("FBPG");
    sesion.removeAttribute("FBES");
    sesion.removeAttribute("FBDY");
    sesion.removeAttribute("FBMX");

    obtenerWriter();
    writer.print("<html><body onload=\"window.close()\"></body></html>");
  }
}