package com.FitBank.web.servlet;

import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;

import com.FitBank.common.Debug;
import com.FitBank.common.Servicios;
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 org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;

/**
 * Servlet que permite leer imagenes ya sea desde un filesystem normal,
 * de un BLOB en la base de datos o del Application Server. Los parametros que
 * se pueden pasar a este servlet son:<br>
 * <ul>
 * <li>num: identificador (clave primaria) de la imagen en la base de datos.
 * <li>sec: numero de pagina en el caso de documentos multipagina.
 * <li>src: si se desea obtener una imagen al interior del AppServer, utilizar
 * este parametro con la direccion de la imagen (por ejm, /imagenes/imagen.jpg).
 * <li>asr: si se desea que la lectura de la imagen indicada en "src" se la haga
 * al interior de este servlet, fijar este parametro con valor diferente de cero,
 * caso contrario si se desea que lo lea en el Core, omitir este parametro o
 * fijarlo en cero.
 * </ul>
 * Nota: cuando se fija src, se puede omitir num y sec.
 * @author FITBANK BC
 * @version 1.0
 */
public class LectorImagen extends BaseServlets {

    protected void inicializar() {
        aceptarGet();
        aceptarPost();
        verificarSesion();
    }

    public void procesarPedido() {
        EjecutarEventos eventoEs = new EjecutarEventos();
        eventoEs.procesoXml.getXmlMensaje().setEncabezado(evento.procesoXml.getXmlMensaje().encabezado);

        boolean inAppServ = false;
        byte decod[] = null;

        if (pedido.getParameter("zoomWin") == null &&
                pedido.getParameter("totPag") == null) {

            //Determina si hay el parametro src
            if (pedido.getParameter("src") == null) {
                inAppServ = true;
            } else if (pedido.getParameter("src") != null && pedido.getParameter("asr") != null) {
                //Si hay el parametro src:
                if (Integer.parseInt(pedido.getParameter("asr")) != 0) {
                    //Si hay el parametro asr=1, procesar lectura aqui
                    String fileName = (String) pedido.getParameter("src");

                    decod = readFromAS(fileName);

                    if (decod == null) {
                        decod = readFromAS("imagenes/noimage.GIF");
                    }
                } else {
                    inAppServ = true;
                }
            } else {
                inAppServ = true;
            }

            if (inAppServ) {
                //Si se va a procesar en el Core, enviar pedido y decodificar imagen
                try {
                    PropertiesHandler ph = new PropertiesHandler("images");
                    String num = pedido.getParameter("num");
                    String tabla = pedido.getParameter("tab");
                    if (StringUtils.isBlank(tabla)) {
                        tabla = "TIMAGENES";
                    }
                    int sec = 0;
                    try {
                        sec = Integer.parseInt(pedido.getParameter("sec"));
                    } catch (Exception e) {
                        sec = 0;
                    }
                    File f = new File(ph.getStringValue("webapp.images.path") + "/IMG" + num + "_" + sec + "_" + tabla);
                    //if (!f.exists()) {
                        if (pedido.getParameter("src") == null) {
                            eventoEs.ejecutarLecturaImagen(pedido, EjecutarEventos.IMAGEN_LECT_NORMAL, "");
                            System.out.println("XML:" + eventoEs.procesoXml.getXmlMensaje());
                        } else {
                            String fileName = pedido.getParameter("src");
                            if (fileName.charAt(0) != '/') {
                                fileName = "/" + fileName;
                            }

                            try {
                                fileName = getServletContext().getResource(fileName).toString();
                            } catch (Exception ex) {
                                fileName = "";
                            }

                            eventoEs.ejecutarLecturaImagen(pedido, EjecutarEventos.IMAGEN_FILESYS_CORE, fileName);
                        }
                    //}

                    //  Imagen im = (Imagen) eventoEs.procesoXml.getXmlMensaje().detalle[0].elementAt(0);
                    //  decod = im.decodificar();


                    FileInputStream fin = new FileInputStream(f);
                    obtenerOutputStream("image/jpeg");
                    IOUtils.copy(fin, outputStream);
                    outputStream.close();
                    fin.close();
                } catch (Exception e) {
                    Debug.imprimirError(e);
                    decod = readFromAS("imagenes/noimage.GIF");
                }
            }

            //Si se tiene los bytes de la imagen, enviarlas al cliente Web.
            if (decod != null) {
                try {
                    obtenerOutputStream();
                    outputStream.write(decod);
                    outputStream.close();
                } catch (Exception e) {
                    Debug.imprimirError(e);
                }
            }
        } else if (pedido.getParameter("zoomWin") != null) {
            //Mostrar ventana que permite hacer zoom-in/zoom-out a las imagenes.
            String num = pedido.getParameter("num");
            int sec = -1;
            if (pedido.getParameter("sec") != null) {
                sec = Integer.parseInt(pedido.getParameter("sec"));
            }

            String tipDoc = Servicios.verificarCadena(pedido.getParameter("tipDoc"));
            String tipPrs = Servicios.verificarCadena(pedido.getParameter("tipPrs"));
            String tabla = Servicios.verificarCadena(pedido.getParameter("tab"));

            if (pedido.getParameter("zoomWin").equals("1")) {
                obtenerWriter();
                if (tipDoc.equals("") && tipPrs.equals("")) {
                    writer.print(ConstruirContenido.ventanaHerramientasImagen(num, sec, tabla, pedido.getSession().getId()));
                } else {
                    writer.print(ConstruirContenido.ventanaHerramientasImagen(num, sec, tipDoc, tipPrs, tabla, pedido.getSession().getId()));
                }

                writer.close();
            }
        } else if (pedido.getParameter("totPag") != null) {
            EjecutarEventos eventoPag = new EjecutarEventos();
            eventoPag.procesoXml.getXmlMensaje().setEncabezado(evento.procesoXml.getXmlMensaje().encabezado);

            eventoPag.ejecutarLecturaImagen(pedido, EjecutarEventos.IMAGEN_MAX_PAGINA, "");

            String pag = eventoPag.procesoXml.getXmlMensaje().getValor("PAG", MensajeXml.SEC_DET);

            obtenerWriter();
            writer.print("<script>");
            writer.print("parent.document.getElementById('" + pedido.getParameter("img") + "MaxPagina').value = " + pag + ";");
            writer.print("</script>");
            writer.close();
        }
    }

    /**
     * Lee un archivo dentro del Application Server o contenedor.
     * @param fileName nombre del archivo a leer dentro del AS.
     * @return un ArrayList con los bytes leidos del archivo.
     */
    private byte[] readFromAS(String fileName) {
        try {
            if (fileName.charAt(0) != '/') {
                fileName = "/" + fileName;
            }

            InputStream in = getServletContext().getResourceAsStream(fileName);
            ArrayList bytList = new ArrayList();
            int bRd = 0;

            while ((bRd = in.read()) != -1) {
                bytList.add(new Byte((byte) bRd));
            }

            in.close();

            byte[] toRet = new byte[bytList.size()];

            for (int i = 0; i < toRet.length; i++) {
                toRet[i] = ((Byte) bytList.get(i)).byteValue();
            }

            return toRet;
        } catch (Exception ex) {
            Debug.imprimirError(ex);
            return null;
        }
    }
}