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

import java.math.BigDecimal;
import java.sql.Date;
import java.sql.Timestamp;
import java.util.ArrayList;
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.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDecomiso;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.sessionbeans.helper.Sequence;

public class ImporteArma extends TransactionRule {

	private static final long serialVersionUID = -7465655492847129136L;

	/**
	 * Armas Decomisadas
	 */
	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
		//EntityManager entityManager = PersistenceHelper.getEntityManager();
		//lista de armas
		 List<Object> listArmas = pSaveRequest.getSaveBeanModifiedRecords("ARMASIMPORTE");
		 //cabecera del arma
		 TarmRegistroArmas registroArmas = (TarmRegistroArmas) pSaveRequest.getSaveBeanModifiedObject("TREGISTROARMAS");
		//detalle del decomiso
    	 List<Object> tarmDecomisoArma = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TARMDECOMISOARMA");//seteado en el decomiso
    	 if(tarmDecomisoArma==null){
    		 tarmDecomisoArma=new ArrayList<>();
    	 }
		// TarmArmas arma = (TarmArmas) pSaveRequest.get("ARMAACTUAL");
		 registroArmas.setPk(getCodigoRegistro());
		 registroArmas.setFcreacion(new Date(System.currentTimeMillis()));
		 
		 //DECOMISO
    	 //se inserta el DECOMISO cabecera
		 TarmDecomiso decomiso=(TarmDecomiso)pSaveRequest.getSaveBeanModifiedObject("IMPORTEDECOMISO");
		 decomiso.setPk(Long.parseLong(getCodigo("CDECOMISO")));
		 decomiso.setNumerotransaccion(getNumeroTransaccion(decomiso.getTipoproceso(), decomiso.getPk().toString()));
			
		 for (Object object : listArmas) {
			 TarmArmas armaNueva = (TarmArmas)object;
			 armaNueva.setPk(getCodigoArma());
			 armaNueva.setFecharegistro(new Date(new java.util.Date().getTime()));
			 armaNueva.setCregistro(registroArmas.getPk());
			 armaNueva.setCodigoarma(armaNueva.getPk());
			 
			//seteo del detalle del DECOMISOARMA  y a que arma se le hace el decomiso
    		 TarmDecomisoArma decomisoArma= new TarmDecomisoArma();
    		 decomisoArma.setCarma( armaNueva.getPk());
    		 //estadoarma es igual que el estado del arma
    		 decomisoArma.setEstado(armaNueva.getEstado());
    		 decomisoArma.setEstadocode(armaNueva.getEstadocodigo());
    		//motivo del decomiso
    		 decomisoArma.setMotivodecomiso(armaNueva.getModifiedData().get("motivocatalogo").toString());//motivo
    		 decomisoArma.setMotivodecomisocodigo(armaNueva.getModifiedData().get("motivocatalogocode").toString());//1
    		 //observacion
    		 decomisoArma.setObservacion(armaNueva.getModifiedData().get("observaciondecomiso").toString());
    		 //cantidad
    		 decomisoArma.setCantidad(new BigDecimal(armaNueva.getModifiedData().get("cantidad").toString()));//cantidad
    		 //unidad del arma o material explosivo
    		 
    		 decomisoArma.setUnidadmedida(armaNueva.getUnidadmedidacantidad());//unidad de medida
    		 decomisoArma.setUnidadmedidacode(armaNueva.getUnidadmedidacantidadcodigo());//3
    		 //fecha del decomiso arma la actual
    		 java.util.Date fechaRecepcion=(java.util.Date)armaNueva.getModifiedData().get("fechaRecepcion");
    		 decomisoArma.setFdecomiso(new Timestamp(fechaRecepcion.getTime()));
    		//codigo del decomiso
    		 decomisoArma.setPk(getCodigo("CDECOMISOARMA"));
    		//codigo del decomiso
    		 decomisoArma.setCdecomiso(decomiso.getPk());
    		 //en bodega
    		 decomisoArma.setEnbodega("Y");
    		 tarmDecomisoArma.add(decomisoArma);
		}
    	
		return pSaveRequest;
	}

	@Override
	public SaveRequest reverseProcess(SaveRequest pRequest) throws Exception {
		return pRequest;
	}
	
	private Long getCodigoRegistro() throws Exception{
		Sequence sequence = new Sequence();
		Long cregistro = sequence.getNextValue("CREGISTRO").longValue();
		return cregistro;
	}
	
	private String getCodigoArma() throws Exception{
		Sequence sequence = new Sequence();
		String carma = sequence.getNextValue("CARMA").toString();
		return carma;
	}
    /**
     * Metodo que devuelve la secuencia del codigo
     * @param codigoSec
     * @return String
     * @throws Exception
     */
    private String getCodigo(String codigoSec) throws Exception {
        Sequence sequence = new Sequence();
        String solcitud = sequence.getNextValue(codigoSec).toString();
        return solcitud;
    }
    
    private String getNumeroTransaccion(String prefijo,String secuencia){
		System.out.println("Ingresa al secuencial armas");
		return prefijo+"-"+StringUtils.leftPad(secuencia, 9, '0');
    }
}
