package com.FitBank.ebusiness.delegate;

import com.FitBank.exception.FitConnectException;
//import com.FitBank.facade.Facade;
//import com.FitBank.facade.FacadeHome;
//import com.FitBank.Main.ObtieneContext;

import com.FitBank.xml.Mensaje.MensajeXml;

import com.fitbank.common.properties.PropertiesHandler;
import com.fitbank.uci.client.UCIClient;

//import java.rmi.RemoteException;

//import javax.ejb.CreateException;

//import javax.naming.Context;
//import javax.naming.InitialContext;
//import javax.naming.NamingException;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;


/**
 * Clase que implementa el acceso a la fachada de la EJB Tier
 * invocando vía RMI al EJB FBEJBFacade, e instanciando el
 * componente.
 * @author  FITBANK
 * @version 2.0 Abril 2004
 * @see InstancerConnect
 */
public class ConnectBusinessEJB implements ConnectBusiness, HttpSessionBindingListener {
    /**
     * Atributo de la clase en el que se coloca el objeto que devuelve el
     * método que instancia eL EJB de fachada.
     */
    //protected Facade facade;
    protected Object facade;

    /**
     * Atributo que contiene el nombre del componente EJB referenciado.
     */
    protected String COMPONENT = "Facade";
    protected String COMMON_ERROR = "CAN'T CONNECT FIT-BANK CORE TIER  ";

    /**
     * Constructor de por defecto de la clase que coloca en null el atributo de
     * la clase.
     */
    public ConnectBusinessEJB() {
        facade = null;
    }

    /**
     * Método que permite enviar el request del cliente y el mensaje de solicitud
     * del sistema a su proceso.
     * @param request Petición del cliente.
     * @param message Objeto que contiene el mensaje generado en el sistema para
     * ser procesado.
     * @return Objeto que contiene el mensaje respuesta del sistema.
     * @throws FitConnectException Exception levantada en caso de que exista fallas
     * en el sistema de busqueda JNDI, creacion de la fachada o de conexión remota.
     */
    public String connectToBusiness(HttpServletRequest request, String message) throws FitConnectException {
        String response = "";
        HttpSession session = request.getSession();
        String messageType = (String)session.getAttribute("TIP_MEN");
        if (facade == null) {
            synchronized (this) {
                try {
                    boolean isUCIprocess = true;
                    try {
                        String subsistema = message.substring(message.indexOf("<SUB>")+5, message.indexOf("<SUB>")+7);
                        String transaccion = message.substring(message.indexOf("<TRN>")+5, message.indexOf("<TRN>")+9);
                        String version = message.substring(message.indexOf("<VER>")+5, message.indexOf("<VER>")+7);
                        PropertiesHandler properties = new PropertiesHandler("bypass");
                        String bypass = properties.getValue(subsistema);
                        if (bypass != null) {
                        String[] transacciones = bypass.split(",");
                            for (int i=0; i <transacciones.length; i++) {
                                if (transacciones[i].equals(transaccion)) {
                                    isUCIprocess = false;
                                }
                            }
                        }
                    } catch (Exception ex) {
                        isUCIprocess = true;
                    }
                    if (isUCIprocess) {
                        response = (String)UCIClient.sendSerializable(message);
                    } else {
                       /* ObtieneContext oc = new ObtieneContext();
                        Context ctx = oc.getInitialContext(1);
                        FacadeHome facadeHome = (FacadeHome)ctx.lookup("Facade");
                        Facade facade = facadeHome.create();
                        response = facade.nativeFitBankInvoke(message, messageType);*/
                    }
                    return response;
               /* } catch (NamingException exc) {
                    throw new FitConnectException(COMMON_ERROR + " NamingException: " + exc.toString());
                } catch (CreateException exc) {
                    throw new FitConnectException(COMMON_ERROR + " CreateException: " + exc.toString());
                } catch (RemoteException exc) {
                    throw new FitConnectException(COMMON_ERROR + " RemoteException: " + exc.toString());*/
                } catch (Exception exc) {
                    exc.printStackTrace(System.err);
                    throw new FitConnectException(COMMON_ERROR + " Exception: " + exc.toString());
                }
            }
        } else
            return null;
    }

    public void valueBound(HttpSessionBindingEvent evt) {
    }

    /**
     * Método que controla el ciclo de vida de la referencia levantada por
     * el método ConnectBusiness hacia la EJBTier. Este método se ejecuta
     * antes de la remoción de las instancias de esta clase y antes de esto
     * ejecuta un close down de la referencia.
     * @param evt Objeto que contiene el evento de la Session.
     */
    public void valueUnbound(HttpSessionBindingEvent evt) {
        // Cuando el objeto desaparece del objeto de session este hace un close down del mismo
        if (facade != null) {
            try {
                //facade.remove();
            } catch (Exception ex) {
                ex.printStackTrace();
            }
        }
    }
}
