package com.fp.sessionbeans.helper;

import javax.naming.InitialContext;

import com.fp.common.properties.PropertiesHandler;
import com.fp.persistence.commondb.PersistenceManager;
import com.fp.persistence.commondb.data.SessionData;
import com.fp.persistence.commondb.data.ThreadFacade;
import com.fp.sessionbeans.ejb.interfaces.SequenceBeanLocal;

/**
 * Calse que se encarga de entregar el consecutivo de una secuencia dado un codigo de sequencia. Ejemplo Codigo dde
 * secuencia, PERSONCODE, entrega el siguiente numero de persona.
 * 
 * @author Jorge Vaca
 * @version 2.1
 */
public class Sequence {

    private Long nextvalue;

    /**
     * Metodo que entrega el numero de solicitud, para el usuario.
     * 
     * @param pQueryRequest Datos del request.
     * @throws Exception
     */
    synchronized public Long getNextValue(String pSequenceCode) throws Exception {
        SessionData sd = ThreadFacade.getSessionData();
        if (sd.isEjb()) {
            return this.getNextValueJta(pSequenceCode);
        }
        this.getNextValueNonJta(pSequenceCode);
        return Long.valueOf(this.nextvalue.toString());
    }

    /**
     * Metodo que entrega el numero de solicitud, para el usuario.
     * 
     * @param pQueryRequest Datos del request.
     * @throws Exception
     */
    public Long getNextValueJta(String pSequenceCode) throws Exception {
        SequenceBeanLocal local = null;
        try {
            PropertiesHandler ph = new PropertiesHandler("fb-facade");
            InitialContext ctx = new InitialContext();
            local = (SequenceBeanLocal) ctx.lookup(ph.getStringValue("ear") + "SequenceBean/local");
            Long sec = local.getNextValueJta(PersistenceManager.getInstance().createEntityManagerLocal(), pSequenceCode);
            return sec;
        } catch (Exception exp) {
            throw exp;
        }
    }

    /**
     * Metodo que entrega el numero de solicitud, para el usuario.
     * 
     * @param pQueryRequest Datos del request.
     * @throws Exception
     */
    private void getNextValueNonJta(String pSequenceCode) throws Exception {
        SequenceThread st = new SequenceThread(this, ThreadFacade.getSessionData().getCompany(), pSequenceCode);
        st.start();
        st.join();
    }

    public void setNextvalue(Long nextvalue) {
        this.nextvalue = nextvalue;
    }

    public Long getNextvalue() {
        return this.nextvalue;
    }
}
