/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package com.fitbank.servlet;

import com.fitbank.common.crypto.Decrypt;
import com.fitbank.common.properties.PropertiesHandler;
import com.fitbank.dto.management.Detail;
import com.fitbank.homebanking.BussinessDelegate;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * Servlet que envia un detail de consulta de una imagen para que esta sea cargada
 * en un directorio especifico del servidor por el core y sea leida por este servlet y enviada hacia el e-banking
 * @author jemm
 */
public class ImageServlet  extends HttpServlet {
    
    /**
   * Metodo que se sobreescribe de la clase padre HttpServlet la misma que devuelve la imagen en bytes hacia el e-banking
   * @param  HttpServletRequest peticion web
   * @param  HttpServletResponse respuesta web
   * @throws Exception
   */
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
     try{
        String num=req.getParameter("img");
        String sec=req.getParameter("sec");
        Detail detail=this.prepareDetail(num,sec);
        detail=this.processDetail(detail);
        PropertiesHandler ph=new PropertiesHandler("images");
        OutputStream os = resp.getOutputStream();
			  resp.setContentType("image/jpeg");
                          resp.setHeader("Pragma", "no-cache");
                          resp.setHeader("Cache-Control", "no-cache");
	FileInputStream fin=new FileInputStream(ph.getStringValue("webapp.images.path")+"IMG"+num+"_"+sec);
          if(fin!=null){	
               byte b[]=new byte[999];
        	int car=0;
        	do{
        		car=fin.read(b);
        		if(car>0){
                      os.write(b);
        		}
        	}while(car>0);
                       os.close();
          fin.close();		  
        }                   
                          
     }catch(Exception e){
      e.printStackTrace();
     }
    }
    
   /**
   * Metodo que setea el detail con los campos de control que indican el codigo de imagen y la secuencia
   * de esta para ser consultada
   * @param  String codigo de imagen
   * @param  String secuencia de imagen
   * @return Detail de peticion
   * @throws Exception
   */
    private Detail prepareDetail(String cimage,String sec)throws Exception{
      Detail detail=new Detail();
        this.setDetailHeader(detail);
        detail.findFieldByNameCreate("NUM").setValue(cimage);
        detail.findFieldByNameCreate("SEC").setValue(sec);
        return detail;
    }
    
    /**
   * Metodo que setea la cabecera del detail
   * de esta para ser consultada
   * @param  Detail de peticion
   * @throws Exception
   */
    private void setDetailHeader(Detail pDetail)throws Exception{
         PropertiesHandler jsonProp = new PropertiesHandler("json");
            pDetail.setUser(jsonProp.getStringValue("json.user"));
            Decrypt de = new Decrypt();
            pDetail.setPassword(de.encrypt(jsonProp.getStringValue("json.password")));
            pDetail.setIpaddress("0.0.0.0");
            pDetail.setType("IMG");
            pDetail.setSessionid(jsonProp.getStringValue("json.sessionId"));
            pDetail.setLanguage(jsonProp.getStringValue("json.language"));
            pDetail.setTerminal(jsonProp.getStringValue("json.terminal"));
            pDetail.setChannel(jsonProp.getStringValue("json.channel"));
            pDetail.setRole(jsonProp.getIntValue("json.rol"));
            pDetail.setCompany(jsonProp.getIntValue("json.company"));
            pDetail.setOriginbranch(jsonProp.getIntValue("json.originbranch"));
            pDetail.setOriginoffice(jsonProp.getIntValue("json.originoffice"));
            pDetail.setSecuritylevel(jsonProp.getIntValue("json.securitylevel"));
            pDetail.setSubsystem(jsonProp.getStringValue("json.subsystem"));
            pDetail.setTransaction(jsonProp.getStringValue("json.transaction"));
            pDetail.setVersion(jsonProp.getStringValue("json.version"));
            pDetail.setAccountingdate(new java.sql.Date(System.currentTimeMillis()));
            pDetail.findFieldByNameCreate("_AUTOLOTE").setValue("1");
    }
    
     /**
   * Metodo que envia el detail a UCI
   * @param  Detail de peticion
   * @return Detail recibido 
   * @throws Exception
   */
    private Detail processDetail(Detail detail)throws Exception{
     BussinessDelegate bd = new BussinessDelegate();
            return bd.process(detail);
    }
    
}
