package com.fitbank.bpm.common;

import org.hibernate.SQLQuery;
import org.hibernate.ScrollMode;
import org.hibernate.ScrollableResults;
import com.fitbank.common.ApplicationDates;
import com.fitbank.common.Helper;
import com.fitbank.common.RequestData;
import com.fitbank.dto.management.Detail;
import com.fitbank.dto.management.Field;

public class Notify extends AbstractFitSend {
    private static final long serialVersionUID = 1L;
    private final static String SELECT_QUERY = "SELECT CUSUARIO FROM TCOMPANIAUSUARIOS "
            + "WHERE CROL = :rol "
            + "AND FHASTA = :fhasta "
            + "AND CPERSONA_COMPANIA = 2";
    private final static String AUTH = "_USER_NOTIFY";

    public Detail execute(Detail pDetail, String pClass, String pRule,
            Detail pOrigin) throws Exception {
        if (RequestData.getOrigin() == null) {
            return pDetail;
        }

        for (Field f : pDetail.getFields()) {
            if (f.getName().indexOf("_ROL") == 0) {
                String rol = (String) f.getValue();
                if (rol.compareTo("X") == 0) {
                    String autorizador = null;

                    ScrollableResults rsLote = null;
                    SQLQuery sqlQry = Helper.getSession().createSQLQuery(
                            SELECT_QUERY);
                    sqlQry.setInteger("rol", Integer.parseInt((String) pDetail
                            .findFieldByNameCreate(AUTH).getValue()));
                    sqlQry.setDate("fhasta",
                            ApplicationDates.DEFAULT_EXPIRY_DATE);
                    rsLote = sqlQry.scroll(ScrollMode.FORWARD_ONLY);
                    if (rsLote.next()) {
                        Object[] obj = rsLote.get();
                        autorizador = (String) (obj[0]);
                        RequestData.getOrigin().findFieldByNameCreate(AUTH)
                                .setValue(autorizador);
                    }
                }
            }
        }

        RequestData.getOrigin().findFieldByNameCreate("__NTPCLASS__")
                .setValue(pClass);
        RequestData.getOrigin().findFieldByNameCreate("__NTPRULE__")
                .setValue(pRule);
        RequestData.getOrigin().findFieldByNameCreate("__POSTEVENT__")
                .setValue("com.fitbank.bpm.common.Notify");
        RequestData.getOrigin().findFieldByNameCreate(AUTH)
                .setValue(pDetail.findFieldByNameCreate(AUTH).getValue());
        RequestData
                .getOrigin()
                .findFieldByNameCreate("BPMInstanceName")
                .setValue(
                        pDetail.findFieldByNameCreate("BPMInstanceName")
                                .getValue());
        if (pDetail.findFieldByNameCreate("_MESSAGE_").getValue() != null) {
            RequestData
                    .getOrigin()
                    .findFieldByNameCreate("_MESSAGE")
                    .setValue(
                            pDetail.findFieldByNameCreate("_MESSAGE_")
                                    .getValue());
            RequestData.getOrigin().findFieldByNameCreate("_MESSAGE_")
                    .setValue(null);
        } else {
            RequestData.getOrigin().findFieldByNameCreate("_MESSAGE")
                    .setValue(pClass);
        }

        if (RequestData.getOrigin() != null) {
            Detail origindetail = RequestData.getOrigin();
            this.copyControlFields(origindetail, pDetail);
            this.setInOriginDetail(origindetail, "APPLYRULE", pRule);
            this.setInOriginDetail(origindetail, "_ORIGIN_MESSAGE",
                    pOrigin.getMessageId());
            this.setInOriginDetail(origindetail, "_ORIGIN_SUBSYSTEM",
                    pOrigin.getSubsystem());
            this.setInOriginDetail(origindetail, "_ORIGIN_TRANSACTION",
                    pOrigin.getTransaction());
            this.setInOriginDetail(origindetail, "_ORIGIN_VERSION",
                    pOrigin.getVersion());
            this.setInOriginDetail(origindetail, "_ORIGIN_USER",
                    pOrigin.getUser());
            this.setInOriginDetail(origindetail, "_ORIGIN_TERMINAL",
                    pOrigin.getTerminal());
            this.setInOriginDetail(origindetail, "_ORIGIN_BRANCH",
                    pOrigin.getOriginBranch());
            this.setInOriginDetail(origindetail, "_ORIGIN_OFFICE",
                    pOrigin.getOriginOffice());
            this.setInOriginDetail(origindetail, "__BPMAUTHUSERS__", pDetail
                    .findFieldByNameCreate("_USER_NOTIFY").getValue());
            this.setInOriginDetail(origindetail, "_NOTIFY_TIME",
                    ApplicationDates.getDBTimestamp());
        } else {
            RequestData.setOrigin(pDetail);
        }

        return pDetail;
    }

    private void copyControlFields(Detail dorigin, Detail detail) {
        for (Field field : detail.getFields()) {
            dorigin.findFieldByNameCreate(field.getName()).setValue(
                    field.getValue());
        }
    }

    private void setInOriginDetail(Detail detail, String field, Object value) {
        detail.findFieldByNameCreate(field).setValue(value);
    }
}