package com.fp.bpm.report;

import java.util.List;

import com.fp.common.exception.CommonException;
import com.fp.dto.query.QueryRequest;
import com.fp.dto.rules.ReportRule;
import com.fp.dto.rules.TransactionRule;
import com.fp.persistence.commondb.db.DataHelper;
import com.fp.persistence.commondb.exception.CommondbException;
import com.fp.persistence.pgeneral.trans.report.TgeneTransactionReports;

public class ReportProcessor {

	/**Objeto con beans utilizados en el proceso de consulta.*/
	private QueryRequest queryRequest; 
	
    /**
     * Metodo que se encarga de llenar tablas utilizadas en la generacion de reportes.
     * @param pQueryRequest	Datos utilizados en la generacion de reportes.
     * @return boolean
     * @throws CommondbException
     * @throws Exception
     */
    public boolean process(QueryRequest pQueryRequest) throws CommondbException, Exception {
    	Thread.currentThread().setName(pQueryRequest.getJournalId());
    	queryRequest = pQueryRequest;
        //Ejecuta consultas especiales para una transaccion.
        this.processByTransaction();        
        return true;
    }

    /**
     * Metodo que ejecuta procesos especiales de consulta por transaccion.
     * @param pQueryRequest  Objeto con beans utilizados en el proceso de consulta.
     * @throws Exception
     */
    private void processByTransaction() throws Exception {
        if (queryRequest.getTransactionModule() == null || queryRequest.getTransactionCode() == null) {
            return;
        }
        List<TgeneTransactionReports> lquery = DataHelper.getInstance().getTgeneTransactionReports(
        		queryRequest.getTransactionModule(), queryRequest.getTransactionCode(), queryRequest.getTransactionVersion());
        if (lquery == null) {
            return;
        }
        for (TgeneTransactionReports obj : lquery) {
            this.processByTransactionRule(obj);
        }
    }

    /**
     * Metodo encargado de ejecutar cada una de las reglas definidas en la transaccion.
     * @param pSaveRequest	Objeto con beans utilizados en el proceso de una transaccion.
     * @param pProcess	Objeto que contiene la regla a ejecutar.
     * @throws Exception
     */
    private void processByTransactionRule(TgeneTransactionReports pObj) throws Exception {
    	ReportRule rule = null;
        try {
            rule = (ReportRule) Class.forName(pObj.getProcesscode()).newInstance();
        } catch (ClassNotFoundException e) {
            throw new CommonException("COMMON-0014", "CLASE {0} A EJECUTAR NO EXISTE  MODULE: {1} TRANS: {2} VERSION {3}", e, pObj.getProcesscode(),
            		queryRequest.getTransactionModule(), queryRequest.getTransactionCode(), queryRequest.getTransactionVersion());
        } catch (ClassCastException e) {
            throw new CommonException("COMMON-0015", "PROCESO {0} A EJECUTAR MODULE: {1} TRANS: {2} VERSION {3} NO IMPLEMENTA {4}", e, pObj.getProcesscode(),
            		queryRequest.getTransactionModule(), queryRequest.getTransactionCode(), queryRequest.getTransactionVersion(), TransactionRule.class.getName());
        }
        rule.process(queryRequest);
    }

}
