package com.fitbank.bpm.common;

import com.fitbank.common.Helper;
import com.fitbank.common.MessageIdGenerator;
import com.fitbank.common.RequestData;
import com.fitbank.common.exception.FitbankException;
import com.fitbank.common.logger.FitbankLogger;
import com.fitbank.dto.GeneralResponse;
import com.fitbank.dto.management.Detail;
import com.fitbank.dto.management.Field;
import com.fitbank.dto.management.Record;
import com.fitbank.dto.management.Table;

public class ExecuteNonTransaction extends AbstractFitSend {

    /**
     *  
     */
    private static final long serialVersionUID = 1L;

    public Detail execute(Detail pDetail, String pSubsystem, String pTransaction, String pVersion) throws Exception {
        Detail originalDetail = pDetail.cloneMe();
        try {
            this.setDetailHeader(pDetail, pSubsystem, pTransaction, pVersion);
            pDetail = this.send(pDetail);
            this.processLoanForBack(originalDetail);
            Helper.commitTransaction();
            Helper.beginTransaction();
        } catch (FitbankException e) {
            FitbankLogger.getLogger().warn(e, e);
            GeneralResponse gr = new GeneralResponse(e.getCode(), e.getMessage());
            pDetail.findFieldByNameCreate("_BPM_FIT_RES").setValue(gr);
            throw e;
        } catch (Exception e) {
            FitbankLogger.getLogger().warn(e, e);
            throw e;
        }
        return pDetail;
    }

    /**
     * @param pDetail
     * @param pSubsystem
     * @param pTransaction
     * @param pVersion
     * @throws Exception
     */
    private void setDetailHeader(Detail pDetail, String pSubsystem, String pTransaction, String pVersion)
            throws Exception {
        pDetail.setMessageid(MessageIdGenerator.getInstance().generateId("BPM"));
        pDetail.setSubsystem(pSubsystem);
        pDetail.setTransaction(pTransaction);
        pDetail.setVersion(pVersion);
        pDetail.setSessionid(RequestData.getDetail().getSessionid());
        pDetail.setTerminal(RequestData.getDetail().getTerminal());
        pDetail.setUser(RequestData.getDetail().getUser());
        pDetail.findFieldByNameCreate("__BPM_CALL_").setValue("1");
        for (Field f : pDetail.getFields()) {
            if ((f.getName().compareTo("RESPONSE") == 0) || (f.getName().indexOf("_USER_") == 0)
                    || (f.getName().compareTo("_AUT_ESTADO") == 0)) {
                f.setValue(null);
            }
        }
    }

    /**
     * @param pDetail
     * @param pSubsystem
     * @param pTransaction
     * @throws Exception
     */
    private void processLoanForBack(Detail pDetail) throws Exception {
        Table t = pDetail.findTableByName("TAUTORIZACIONFLUJO");
        if (t == null) {
            return;
        }
        Record record = t.getRecords().iterator().next();
        if (record != null) {
            if (record.findFieldByName("TSUBSISTEMATRANSACCIONES+CSUBSISTEMA") == null) {
                return;
            }
            String subsystem = (String) record.findFieldByName("TSUBSISTEMATRANSACCIONES+CSUBSISTEMA").getValue();
            String transaction = (String) record.findFieldByName("TSUBSISTEMATRANSACCIONES+CTRANSACCION").getValue();
            if ((subsystem.compareTo("06") == 0) && (transaction.compareTo("2200") == 0)) {
                this.setDetailHeader(pDetail, "05", "7700", "01");
                pDetail.findFieldByNameCreate("SECUENCIASOLICITUD").setValue(1);
                pDetail.findFieldByNameCreate("CHECKBACKTOBCKARULES").setValue("1");
                pDetail = this.send(pDetail);
            }
        }
    }

}
