package com.fp.armas.rules.save.solicitudimportacion;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.persistence.EntityManager;
import javax.persistence.Query;

import com.fp.armas.rules.exception.ControlArmasException;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.fun.TarmTotalPersona;
import com.fp.persistence.parmas.param.TarmComercianteCupo;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmSolicitudArmas;
import com.fp.persistence.parmas.soli.TarmSolicitudTramite;
import com.fp.persistence.pgeneral.gene.TgeneCatalogDetail;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Ingresa un registro y actualiza la tabla de cupos
 * @author Andres Cevallos
 *
 */
public class CompletarDesaduanizacion extends TransactionRule {

	
	private static final long serialVersionUID = 1L;
	private static final String JPQL_ARMASDELTRAMITESINLOTE = "FROM TarmArmas ARM WHERE "
			+ "ARM.pk IN (select SA.pk.carma from TarmSolicitudArmas SA WHERE SA.pk.csolicitud = :csolicitud) AND ARM.lote IS NULL";
	
	private static final String JPQL_TRAMITEACTUAL = "FROM TarmSolicitudTramite t WHERE t.pk.csolicitud = :noSolicitud";
	
	private static final String JPQL_LOTEDUPLICADO = "FROM TarmArmas ARM WHERE ARM.pk IN "
			+ "(select SA.pk.carma from TarmSolicitudArmas SA WHERE SA.pk.csolicitud = :csolicitud) AND ARM.lote = :lote";
	
	
	/* (non-Javadoc)
	 * @see com.fp.dto.rules.TransactionRule#normalProcess(com.fp.dto.save.SaveRequest)
	 */
	@Override
	@SuppressWarnings("unchecked")
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
//		try {
		Boolean requiereDesgloce = (Boolean) pSaveRequest.get("REQUIEREDESGLOCE");
		if(!requiereDesgloce){		
			System.out.println("*****COMPLETAR LA DESADUANIZACION*****");
			EntityManager em=PersistenceHelper.getEntityManager();
			List<Object>armasLst=(List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DESADUANIZACION");		
			String noSolicitud=pSaveRequest.get("noSolicitud").toString();
			TarmSolicitudTramite solicitudTramiteObj = consultaTramiteActual(em, noSolicitud);
			Boolean validaDuplicados = Boolean.FALSE;
			for(Object armaTmp:armasLst){
				TarmArmas arma=(TarmArmas)armaTmp;
				TarmArmas armaDuplicada = consultaLoteDuplicado(em, noSolicitud, arma.getLote());
				if(armaDuplicada!=null){
					throw new ControlArmasException("ARM-0001", "EL LOTE {0} SE ENCUENTRA DUPLICADO.", armaDuplicada.getLote());
				}
			}
			
			for(Object armaTmp:armasLst){				
				TarmArmas arma=(TarmArmas)armaTmp;
				em.merge(arma);
			}
			em.flush();
			if(solicitudTramiteObj!=null){			
				if(!existeArmasConLotePendienteIngreso(em, solicitudTramiteObj.getPk().getCsolicitud())){
					solicitudTramiteObj.setEstadotramite("FIN");
					em.merge(solicitudTramiteObj);	
					em.flush();
				}
			}
		}
//		} catch (Exception e) {
//			return pSaveRequest;
//			// TODO: handle exception
//		}
		return pSaveRequest;		
	}

	@Override
	public SaveRequest reverseProcess(SaveRequest arg0) throws Exception {

		return arg0;
	}
		
	public Boolean existeArmasConLotePendienteIngreso(EntityManager pEntityManager,String csolicitud){
		Boolean resultado = Boolean.FALSE;
		Query qry = pEntityManager.createQuery(CompletarDesaduanizacion.JPQL_ARMASDELTRAMITESINLOTE);
		qry.setParameter("csolicitud", csolicitud);
		List<TarmArmas>armasPendientesLst = qry.getResultList();
	    
	    if(armasPendientesLst!=null && !armasPendientesLst.isEmpty()){
	    	resultado = Boolean.TRUE;
	    }
		return resultado;		
	}
	public TarmSolicitudTramite consultaTramiteActual(EntityManager pEntityManager,String noSolicitud){		
		Query qry = pEntityManager.createQuery(CompletarDesaduanizacion.JPQL_TRAMITEACTUAL);
		qry.setParameter("noSolicitud", noSolicitud);
		List<TarmSolicitudTramite>solicitudTramiteLst = qry.getResultList();
	    
	    if(solicitudTramiteLst!=null && !solicitudTramiteLst.isEmpty()){
	    	return solicitudTramiteLst.get(0);
	    }
	    else{
	    	return null;
	    }
	}
	
	public TarmArmas consultaLoteDuplicado(EntityManager pEntityManager,String csolicitud, String lote){		
		Query qry = pEntityManager.createQuery(CompletarDesaduanizacion.JPQL_LOTEDUPLICADO);
		qry.setParameter("csolicitud", csolicitud);
		qry.setParameter("lote", lote);
		List<TarmArmas>armasConLoteDuplicadoLst = qry.getResultList();
	    
	    if(armasConLoteDuplicadoLst!=null && !armasConLoteDuplicadoLst.isEmpty()){
	    	return armasConLoteDuplicadoLst.get(0);
	    }
	    else{
	    	return null;
	    }
	}
}