package com.fp.general.helper;

import com.fp.dto.Response;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.QueryRule;
import com.fp.persistence.commondb.HqlStatement;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pgeneral.gene.TgeneUserSolicitudeNumber;
import com.fp.persistence.pgeneral.safe.TsafeUser;

/**
 * Clase que entrega la secuencia de solicitud a utilizar por usuario.
 * 
 * @author Jorge Vaca
 * @version 2.1
 */
public class SolicitudeNumber extends QueryRule {

    /**
     * Metodo que entrega el numero de solicitud, para el usuario.
     * 
     * @param pQueryRequest Datos del request.
     * @throws Exception
     */
    @Override
    public QueryRequest process(QueryRequest pQueryRequest) throws Exception {
        Response response = pQueryRequest.getResponse();
        try {
            TgeneUserSolicitudeNumber solicitudnumber = this.getTgeneUserSolicitudeNumber(pQueryRequest.getUser());
            if (pQueryRequest.getInternalUserCode() == null) {
                TsafeUser user = com.fp.base.persistence.util.db.DataHelper.getInstance().getTsafeUser(pQueryRequest.getUser());
                pQueryRequest.setInternalUserCode(user.getInternalcode());
            }
            String sol = pQueryRequest.getInternalUserCode() + solicitudnumber.getSolicitudnumber();
            response.put("solicitudenumber", sol);
            solicitudnumber = PersistenceHelper.getEntityManager().merge(solicitudnumber);

            return pQueryRequest;
        } catch (Exception e) {
            throw e;
        }
    }

    /**
     * Metodo que entrega la secuencia de solicitud a utilizar, esta se define por usuario.<br>
     * Si no existe un registro en la tabla crea uno, si existe suma 1 a la secuencia de la solicitud.
     * 
     * @param pUserCode Codigo de usuario a obtener el numero de solicitud.
     * @return TgeneUserSolicitudeNumber
     * @throws Exception
     */
    protected TgeneUserSolicitudeNumber getTgeneUserSolicitudeNumber(String pUserCode) throws Exception {
        TgeneUserSolicitudeNumber tgeneUserSolicitudeNumber = null;
        HqlStatement hql = new HqlStatement(SolicitudeNumber.HQL);
        hql.setString("usercode", pUserCode);
        tgeneUserSolicitudeNumber = (TgeneUserSolicitudeNumber) hql.getObject();
        if (tgeneUserSolicitudeNumber == null) {
            tgeneUserSolicitudeNumber = new TgeneUserSolicitudeNumber();
            tgeneUserSolicitudeNumber.setPk(pUserCode);
            tgeneUserSolicitudeNumber.setSolicitudnumber("0");
        }
        Integer sec = Integer.valueOf(tgeneUserSolicitudeNumber.getSolicitudnumber());
        sec++;
        tgeneUserSolicitudeNumber.setSolicitudnumber(sec.toString());
        return tgeneUserSolicitudeNumber;
    }

    /** Sentencia que obtiene un registro de TgeneUserSolicitudeNumber con la secuencia de solicitud por usuario. */
    private static final String HQL = "from com.fp.persistence.pgeneral.gene.TgeneUserSolicitudeNumber t " + " where t.pk = :usercode ";
}
