package com.fp.general.application;

import java.util.List;

import com.fp.bpmlib.task.client.TaskUtil;
import com.fp.common.helper.BeanManager;
import com.fp.common.helper.Constant;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pgeneral.auth.TgeneSolicitudeClientdata;
import com.fp.simple.dto.Responses;

/**
 * Calse que valida que este revisado los datos de clientes.
 * 
 * @author Jorge Vaca.
 * @version 2.1
 */
public class ClientApproval extends TransactionRule {

    /*
     * (non-Javadoc)
     * 
     * @see com.fp.dto.rules.TransactionRule#normalProcess(com.fp.dto.save.SaveRequest)
     */
    @Override
    public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
        List<Object> ldata = pSaveRequest.getSaveBeanModifiedRecords("TGENESOLICITUDECLIENTDATA");
        if ((ldata == null) || ldata.isEmpty()) {
            return pSaveRequest;
        }
        TgeneSolicitudeClientdata client = (TgeneSolicitudeClientdata) ldata.get(0);
        List<TgeneSolicitudeClientdata> ldatabasedata = TgeneSolicitudeClientdata.find(PersistenceHelper.getEntityManager(), client.getPk()
                .getSolicitudnumber(), client.getPk().getSolicitudsequence());
        if ((pSaveRequest.get(TaskUtil.BPM_TID) != null) && this.validate(ldata, ldatabasedata)) {
            pSaveRequest.put(TaskUtil.BPM_STATUS, Responses.OK.getCode());
        } else {
            pSaveRequest.put(TaskUtil.BPM_STATUS, null);
            pSaveRequest.put(TaskUtil.BPM_TID, null);
        }
        return pSaveRequest;
    }

    /**
     * Verifica que los datos de de cleintes esten aprobados.
     * 
     * @param ldata Datos de aprobacion que llegan en el request.
     * @param ldatabasedata Datos de aprobacion que almacenados en la base de datos.
     * @return boolean
     * @throws Exception
     */
    private boolean validate(List<Object> ldata, List<TgeneSolicitudeClientdata> ldatabasedata) throws Exception {
        if (!this.validateData(ldata)) {
            return false;
        }
        for (TgeneSolicitudeClientdata obj : ldatabasedata) {
            if (!this.validateByRecord(obj, ldata)) {
                return false;
            }
        }
        return true;
    }

    /**
     * Valida que la informacion que llega en el request este aprobada, si no esta aprobada retorna false.
     * 
     * @param ldata Datos de aprobacion que llegan en el request.
     * @return boolean
     * @throws Exception
     */
    private boolean validateData(List<Object> ldata) throws Exception {
        for (Object object : ldata) {
            if (!Constant.ifYes(((TgeneSolicitudeClientdata) object).getChecked())) {
                return false;
            }
        }
        return true;
    }

    /**
     * Valida que el registro de verificacion de datos de clientes este aprobado, sea en los datos que llegan en el
     * request o este haya sido aprobado con anterioridad.
     * 
     * @param client Datos de la base a verificar que el registro este aprobado.
     * @param ldata Lista de datos de aprobacion que llegan en el request.
     * @return boolean.
     * @throws Exception
     */
    private boolean validateByRecord(TgeneSolicitudeClientdata client, List<Object> ldata) throws Exception {
        for (Object object : ldata) {
            TgeneSolicitudeClientdata obj = (TgeneSolicitudeClientdata) object;
            if (BeanManager.compareObject(client.getPk(), obj.getPk())) {
                return true;
            }
        }
        if (Constant.ifYes(client.getChecked())) {
            return true;
        }
        return false;
    }

    /*
     * (non-Javadoc)
     * 
     * @see com.fp.dto.rules.TransactionRule#reverseProcess(com.fp.dto.save.SaveRequest)
     */
    @Override
    public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
        return pSaveRequest;
    }

}
