package com.fp.general.security.rules;

import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveBean;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pgeneral.menu.TgeneMenuLevel;
import com.fp.persistence.pgeneral.menu.TgeneMenuLevelDesc;
import com.fp.persistence.pgeneral.menu.TgeneMenuLevelKey;
import com.fp.persistence.pgeneral.menu.TgeneMenuSubLevel;
import com.fp.persistence.pgeneral.menu.TgeneMenuSubLevelDesc;
import com.fp.persistence.pgeneral.menu.TgeneMenuSubLevelKey;

import java.util.ArrayList;
import java.util.List;

import javax.persistence.Query;

/**
 * Clase que se encarga de del mantenimiento de menu para que se vuelva mas simple su manejo
 * @author scastillo
 */
public class MaintenanceMenu extends TransactionRule {

    /**
     * Metodo que se ejecuta en modo normal
     * @param pSaveRequest
     * @return
     * @throws Exception 
     */
    @Override
    public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
        List<Object> lmodifyMenuLevel = pSaveRequest.getSaveBeanModifiedRecords("TGENEMENULEVELDESC");
        this.completeMenuLevel(pSaveRequest, lmodifyMenuLevel);
        
        List<Object> ldeleteMenuLevel = pSaveRequest.getSaveBeanDeletedRecords("TGENEMENULEVELDESC");
        this.deleteMenuLevel(pSaveRequest, ldeleteMenuLevel);
        List<Object> lmodifyMenuSubLevel = pSaveRequest.getSaveBeanModifiedRecords("TGENEMENUSUBLEVELDESC");
        this.completeMenuSubLevel(pSaveRequest, lmodifyMenuSubLevel);
        
        List<Object> ldeleteMenuSubLevel = pSaveRequest.getSaveBeanDeletedRecords("TGENEMENUSUBLEVELDESC");
        this.deleteMenuSubLevel(pSaveRequest, ldeleteMenuSubLevel);
        return pSaveRequest;
    }

    /**
     * Metodo que se encarga de verificar los datos cuando estos son eliminados
     * @param pSaveRequest
     * @param lmodifyMenuLevel
     * @throws Exception 
     */
    private void completeMenuLevel(SaveRequest pSaveRequest, List<Object> lmodifyMenuLevel) throws Exception {
        if (lmodifyMenuLevel != null) {
            List<TgeneMenuLevel> lTgeneMenuLevel = new ArrayList<TgeneMenuLevel>();
            for (int i = 0; i < lmodifyMenuLevel.size(); i++) {
                TgeneMenuLevelDesc tgeneMenuLevelDesc = (TgeneMenuLevelDesc) lmodifyMenuLevel.get(i);
                Integer presentationorder = new Integer(tgeneMenuLevelDesc.get("presentationorder").toString());
                
                TgeneMenuLevelKey TgeneMenuLevelKey = new TgeneMenuLevelKey();
                TgeneMenuLevelKey.setMenucode(tgeneMenuLevelDesc.getPk().getMenucode());
                TgeneMenuLevelKey.setLevelcode(tgeneMenuLevelDesc.getPk().getLevelcode());
                TgeneMenuLevel tgeneMenuLevel = TgeneMenuLevel.find(PersistenceHelper.getEntityManager(), TgeneMenuLevelKey);
                if (tgeneMenuLevel == null) {
                    tgeneMenuLevel = new TgeneMenuLevel();
                    tgeneMenuLevel.setPk(TgeneMenuLevelKey);
                    tgeneMenuLevel.setHavesublevel("Y");
                    tgeneMenuLevel.setPresentationorder(presentationorder);
                    lTgeneMenuLevel.add(tgeneMenuLevel);
                } else {
                    if (tgeneMenuLevel.getPresentationorder() != presentationorder) {
                        tgeneMenuLevel.setPresentationorder(presentationorder);
                        lTgeneMenuLevel.add(tgeneMenuLevel);
                    }
                }
            }
            if (lTgeneMenuLevel.size() > 0) {
                pSaveRequest.putSaveBean("TGENEMENULEVEL", lTgeneMenuLevel, 1);
            }
        }
    }

    /**
     * 
     * @param pSaveRequest
     * @param ldeleteMenuLevel
     * @throws Exception 
     */
    private void deleteMenuLevel(SaveRequest pSaveRequest, List<Object> ldeleteMenuLevel) throws Exception {
        if(ldeleteMenuLevel == null){
        	return;
        }
        List<Object> ldeleterecors = new ArrayList<Object>();
    	for (int i = 0; i < ldeleteMenuLevel.size(); i++) {
            TgeneMenuLevelDesc tgeneMenuLevelDesc = (TgeneMenuLevelDesc) ldeleteMenuLevel.get(i);
            TgeneMenuLevelKey TgeneMenuLevelKey = new TgeneMenuLevelKey();
            TgeneMenuLevelKey.setMenucode(tgeneMenuLevelDesc.getPk().getMenucode());
            TgeneMenuLevelKey.setLevelcode(tgeneMenuLevelDesc.getPk().getLevelcode());
            TgeneMenuLevel tgeneMenuLevel = TgeneMenuLevel.find(PersistenceHelper.getEntityManager(), TgeneMenuLevelKey);
            if (tgeneMenuLevel != null) {
            	ldeleterecors.add(tgeneMenuLevel);
            }
        }
    	if(!ldeleterecors.isEmpty()){
    		SaveBean sb = (SaveBean)pSaveRequest.get("TGENEMENULEVEL");
        	if(sb!=null){
        		sb.setDeletedRecords(ldeleterecors);
        	}
    	}
    }

    /**
     * Metodo que completa y modificalos datos para subniveles
     * @param pSaveRequest
     * @param lmodifyMenuSubLevel
     * @throws Exception 
     */
    private void completeMenuSubLevel(SaveRequest pSaveRequest, List<Object> lmodifyMenuSubLevel) throws Exception {
        if (lmodifyMenuSubLevel != null) {
            List<TgeneMenuSubLevel> lTgeneMenuSubLevel = new ArrayList<TgeneMenuSubLevel>();
            for (int i = 0; i < lmodifyMenuSubLevel.size(); i++) {
                TgeneMenuSubLevelDesc tgeneMenuSubLevelDesc = (TgeneMenuSubLevelDesc) lmodifyMenuSubLevel.get(i);
                Integer presentationorder = new Integer(tgeneMenuSubLevelDesc.get("presentationorder").toString());
                TgeneMenuSubLevelKey tgeneMenuSubLevelKey = new TgeneMenuSubLevelKey();
                tgeneMenuSubLevelKey.setMenucode(tgeneMenuSubLevelDesc.getPk().getMenucode());
                tgeneMenuSubLevelKey.setLevelcode(tgeneMenuSubLevelDesc.getPk().getLevelcode());
                tgeneMenuSubLevelKey.setSublevel(tgeneMenuSubLevelDesc.getPk().getSublevel());
                TgeneMenuSubLevel tgeneMenuSubLevel = TgeneMenuSubLevel.find(PersistenceHelper.getEntityManager(), tgeneMenuSubLevelKey);
                if (tgeneMenuSubLevel == null) {
                    tgeneMenuSubLevel = new TgeneMenuSubLevel();
                    tgeneMenuSubLevel.setPk(tgeneMenuSubLevelKey);
                    tgeneMenuSubLevel.setPresentationorder(presentationorder);
                    lTgeneMenuSubLevel.add(tgeneMenuSubLevel);
                } else {
                    if (tgeneMenuSubLevel.getPresentationorder() != presentationorder) {
                        tgeneMenuSubLevel.setPresentationorder(presentationorder);
                        lTgeneMenuSubLevel.add(tgeneMenuSubLevel);
                    }
                }
            }
            if (lTgeneMenuSubLevel.size() > 0) {
                pSaveRequest.putSaveBean("TGENEMENUSUBLEVEL", lTgeneMenuSubLevel, 1);
            }
        }
    }
    
    /**
     * 
     * @param pSaveRequest
     * @param ldeleteMenuLevel
     * @throws Exception 
     */
    private void deleteMenuSubLevel(SaveRequest pSaveRequest, List<Object> ldeleteMenuSubLevel) throws Exception {
        if(ldeleteMenuSubLevel == null){
        	return;
        }
        List<Object> ldeleterecors = new ArrayList<Object>();
    	for (int i = 0; i < ldeleteMenuSubLevel.size(); i++) {
    		TgeneMenuSubLevelDesc tgeneMenuSubLevelDesc = (TgeneMenuSubLevelDesc) ldeleteMenuSubLevel.get(i);
            TgeneMenuSubLevelKey TgeneMenuSubLevelKey = new TgeneMenuSubLevelKey();
            TgeneMenuSubLevelKey.setMenucode(tgeneMenuSubLevelDesc.getPk().getMenucode());
            TgeneMenuSubLevelKey.setLevelcode(tgeneMenuSubLevelDesc.getPk().getLevelcode());
            TgeneMenuSubLevelKey.setSublevel(tgeneMenuSubLevelDesc.getPk().getSublevel());
            TgeneMenuSubLevel tgeneMenuSubLevel = TgeneMenuSubLevel.find(PersistenceHelper.getEntityManager(), TgeneMenuSubLevelKey);
            PersistenceHelper.delete(tgeneMenuSubLevelDesc);
            if (tgeneMenuSubLevel != null) {
            	PersistenceHelper.delete(tgeneMenuSubLevel);
            	//ldeleterecors.add(tgeneMenuSubLevel);
            }
        }
    	SaveBean sb = (SaveBean)pSaveRequest.get("TGENEMENUSUBLEVELDESC");
    	if(sb!=null){
    		sb.setDeletedRecords(new ArrayList<>());
    	}
    	//if(!ldeleterecors.isEmpty()){
    	//	SaveBean sb = (SaveBean)pSaveRequest.get("TGENEMENUSUBLEVEL");
        //  	if(sb!=null){
        //		sb.setDeletedRecords(ldeleterecors);
        //	}
    	//}
    }

    /**
     * Metodo que se ejecuta en modo reverso
     * @param pSaveRequest
     * @return
     * @throws Exception 
     */
    @Override
    public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
        return pSaveRequest;
    }
}
