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

import java.sql.Timestamp;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;

import org.apache.commons.lang.StringUtils;

import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.soli.TarmBodega;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmDecomisoArmaTransaccion;
import com.fp.persistence.parmas.soli.TarmTransaccionArmaBodega;
import com.fp.persistence.pgeneral.gene.TgeneParameters;
import com.fp.persistence.pgeneral.gene.TgeneParametersKey;
import com.fp.sessionbeans.helper.Sequence;

public class DecomisoArmaRecepcion extends TransactionRule {

	/**
	 * 
	 */
	private static final long serialVersionUID = -1840770563013500407L;

	@SuppressWarnings("unchecked")
	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {

		TarmDecomisoArmaTransaccion decomisoArmaTransaccion=(TarmDecomisoArmaTransaccion) pSaveRequest.getSaveBeanModifiedObject("DECOMISOARMATRANSACCION");
		//para las transacciones de la bodega
		List<Object> transaccionArmaBodegas=(List<Object>) pSaveRequest.getSaveBeanModifiedRecords("TRANSACCIONARMABODEGA");
		List<Object> bodegas=(List<Object>) pSaveRequest.getSaveBeanModifiedRecords("BODEGA");
		
		if(decomisoArmaTransaccion==null){
			return pSaveRequest;
		}
		
		if(transaccionArmaBodegas==null){
			transaccionArmaBodegas= new ArrayList<>();
		}
		if(bodegas==null){
			bodegas=new ArrayList<>();
		}
		
		TgeneParametersKey pKey= new TgeneParametersKey();
		pKey.setCode("CODIGO.RECEPCION");
		pKey.setCompanycode(1);
		TgeneParameters parametro =TgeneParameters.find(PersistenceHelper.getEntityManager(), pKey);
		
		String prefijo=pSaveRequest.get("prefijo").toString();
		Calendar cal=Calendar.getInstance();
		java.sql.Date fechaRegistro=new java.sql.Date(cal.getTimeInMillis());
		//GENERA EL CODIGO PARA NUMERO DE TRANSACCION
		//Long codigoGenerado = Long.parseLong(getCodigo("DECARMTRANRECECCION"));

		decomisoArmaTransaccion.setPk(Long.parseLong(getCodigo("CDECOMISOARMATRANSACCION")));
		decomisoArmaTransaccion.setFtransaccion(fechaRegistro);
		decomisoArmaTransaccion.setNumerotransaccion( getNumeroTransaccion(prefijo,decomisoArmaTransaccion.getPk().toString()));

		//actualizacion del decomiso cabecera el centro control destino
		TarmDecomiso  decomiso=(TarmDecomiso)pSaveRequest.getSaveBeanModifiedObject("DECOMISO");
		
		
		TarmDecomisoArma decomisoArma=(TarmDecomisoArma)pSaveRequest.getSaveBeanModifiedObject("DECOMARMTRANRECECCION");		
		List<Object> lDecomisoArma = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DECOMARMTRANRECECCION");

		if(lDecomisoArma.isEmpty()){
			lDecomisoArma.add(decomisoArma);
		}	

		for (Object object : lDecomisoArma) {
			TarmDecomisoArma c=(TarmDecomisoArma)object;
			if(c.getModifiedData().get("seleccion").equals(Boolean.TRUE)){
				String centroControl=null;
				//bodega de origen por envio
				if(c.getCdecomisoarmatransaccion()!=null && c.getCdecomisoarmatransaccion()>0){
					TarmDecomisoArmaTransaccion transa= TarmDecomisoArmaTransaccion.find(PersistenceHelper.getEntityManager(), c.getCdecomisoarmatransaccion());
					centroControl=transa.getCcentrocontrol();
				}else{
					centroControl=c.getModifiedData().get("ccentrocontrol").toString();
				}
				c.setCdecarmtranrecepcion(decomisoArmaTransaccion.getPk());
				//transaccion del arma
				TarmTransaccionArmaBodega tarmTransaccionArmaBodega = new TarmTransaccionArmaBodega();
				tarmTransaccionArmaBodega.setPk(Long.parseLong(getCodigo("CTRANARMBODEGA")));
				tarmTransaccionArmaBodega.setCdecomisoarmatransaccion(decomisoArmaTransaccion.getPk());
				tarmTransaccionArmaBodega.setCcentrocontrolorigen(centroControl);
				tarmTransaccionArmaBodega.setCcentrocontroldestino(decomisoArmaTransaccion.getCcentrocontrol());
				tarmTransaccionArmaBodega.setCarma(c.getCarma());
				tarmTransaccionArmaBodega.setOperacioncode("OPERACIONDECOMISO");
				tarmTransaccionArmaBodega.setOperacion(parametro.getTextvalue());
				tarmTransaccionArmaBodega.setFecha(new Timestamp(new Date().getTime()));
				transaccionArmaBodegas.add(tarmTransaccionArmaBodega);
				//bodega actualiza o inserta
				TarmBodega bodega=null;
				List<TarmBodega> bodegal=PersistenceHelper.getEntityManager()
						.createQuery("select o from TarmBodega o where o.carma=:carma")
						.setParameter("carma", c.getCarma())
						.getResultList();
				if(bodegal!=null && bodegal.size()>0){
					bodega=bodegal.get(0);
				}
				if(bodega==null){
					bodega= new TarmBodega();
					bodega.setPk(Long.parseLong(getCodigo("CBODEGA")));
				}
				bodega.setCarma(c.getCarma());
				bodega.setCcentrocontrol(decomisoArmaTransaccion.getCcentrocontrol());
				bodegas.add(bodega);
				//actualiza la cab del decomiso centro conttrol destino
				decomiso=TarmDecomiso.find(PersistenceHelper.getEntityManager(), c.getCdecomiso());
				decomiso.setCcentrocontroldestino(decomisoArmaTransaccion.getCcentrocontrol());
			}
		}
		pSaveRequest.getResponse().put("numerotransaccionrecep", decomisoArmaTransaccion.getNumerotransaccion());
		return pSaveRequest;
	}
	

	@Override
	public SaveRequest reverseProcess(SaveRequest arg0) throws Exception {
		// TODO Auto-generated method stub
		return null;
	}
	
    private String getCodigo(String codigoSec) throws Exception {
        Sequence sequence = new Sequence();
        Integer solcitud = Integer.valueOf(sequence.getNextValue(codigoSec).toString());
        return solcitud.toString();
    }
    
    private String getNumeroTransaccion(String prefijo,String secuencia){
		System.out.println("Ingresa al secuencial");
		return prefijo+"-"+StringUtils.leftPad(secuencia, 9, '0');
    }
		

}
