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

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

import org.apache.commons.lang.StringUtils;

import com.fp.dto.data.SaveData;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmCustodiaTemporal;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonDetailKey;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Clase que se encarga de completar información para realizar una custodia temporal.
 * 
 * @author C.P.
 * @version 2.1
 */
public class CustodiaTemporal extends TransactionRule {

    private static final long serialVersionUID = 1L;

    /*
     * (non-Javadoc)
     * 
     * @see com.fp.dto.rules.TransactionRule#normalProcess(com.fp.dto.save.SaveRequest)
     */
    @Override 
    public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
    	 List<Object> armaList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("ARMAS");
    	 List<Object> custodiaTemporalList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("CUSTODIATEM");
    	 //tabla del detalle de la custodia
    	 List<Object> tarmDecomisoArma = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TARMDECOMISOARMA");
    	 
    	 //registramos el arma y si ya existe le cambiamos de estado
    	 for(Object obj:armaList){
    		 TarmArmas arma=(TarmArmas)obj;
    		 //creamos el arma
    		 arma.setPk(getCodigo("CARMA"));
			 if(tarmDecomisoArma!=null && tarmDecomisoArma.size()>0){
				 TarmDecomisoArma decomisoArma= (TarmDecomisoArma)tarmDecomisoArma.get(0);
				 decomisoArma.setCarma( arma.getPk());
			 }else{
				 //seteo del detalle del decomiso  y a que arma se le hace el decomiso
	    		 TarmDecomisoArma decomisoArma= new TarmDecomisoArma();
	    		 decomisoArma.setCarma( arma.getPk());
	    		 decomisoArma.setObservacion(arma.getModifiedData().get("observacion").toString());
	    		 //unidad de medida
	    		 decomisoArma.setUnidadmedida(arma.getUnidadmedidacantidad());//unidad de medida
	    		 decomisoArma.setUnidadmedidacode(arma.getUnidadmedidacantidadcodigo());//3
	    		 //estado igual al del arma
	    		 decomisoArma.setEstado(arma.getEstado());
	    		 decomisoArma.setEstadocode(arma.getEstadocodigo());
	    		 //cantidad
	    		 if(arma.getCantidad()!=null){
	    			 decomisoArma.setCantidad(new BigDecimal(arma.getCantidad()));
	    		 }
	    		 //estados anteriores
	    		 if(arma.getModifiedData().get("estadoanterior")!=null){
	    			 decomisoArma.setEstadoanterior(arma.getModifiedData().get("estadoanterior").toString());
	    		 }
	    		 decomisoArma.setFdecomiso((new Timestamp(new java.util.Date().getTime())));
	    		 //codigo del arma
	    		 decomisoArma.setCarma(arma.getPk());
	    		 tarmDecomisoArma.add(decomisoArma); 
			 }
    	 }
    	 TarmCustodiaTemporal custodiaTem=null;
    	 if(custodiaTemporalList!=null && custodiaTemporalList.size()>0){
    		 //seteo de los codigos de la custodia temporal
        	 for(Object obj:custodiaTemporalList){
        		 custodiaTem=(TarmCustodiaTemporal)obj;
        		 custodiaTem.setPk(getCodigo("CCUSTEMP"));
        		 custodiaTem.setNotransaccion(getNumeroTransaccion(custodiaTem.getTiporegistro(), custodiaTem.getPk().toString()));
        		 pSaveRequest.getResponse().put("numerotransaccion",custodiaTem.getNotransaccion());
        	 }
    	 }
    	
    	 //se inserta el detalle del decomiso 
    	 for(Object obj:tarmDecomisoArma){
    		 TarmDecomisoArma decomisoArma=(TarmDecomisoArma)obj;
    		 if(custodiaTem!=null){
    			 decomisoArma.setCcustemp(custodiaTem.getPk());//codigo del arma
    		 }
    		 decomisoArma.setPk(getCodigo("CDECOMISOARMA"));
    		 
    	 }
        return pSaveRequest;
    }

    /**
     * Metodo que devuelve la secuencia que le pertenece a una nueva persona.
     * 
     * @return Codigo de la nueva persona.
     * @throws Exception
     */
    protected Integer getPersonCode() throws Exception {
        Sequence sequence = new Sequence();
        Integer personcode = Integer.valueOf(sequence.getNextValue("PERSONCODE").toString());
        SaveData.getMap().put("PERSONCODE", personcode.toString());
        return personcode;
    }
    
    /**
     * Completa el codigo de la persona en la tabla TcustPersonDetail
     * 
     * @param tcustPersonDetail Objeto que posee el registro a guardar en la tabla TcustPersonDetail.
     * @param personcode Codigo de la nueva persona a ser guardada.
     * @throws Exception
     */
    protected void completePersonDetail(TcustPersonDetail tcustPersonDetail, Integer personcode) throws Exception {
        TcustPersonDetailKey tcustPersonDetailKey = new TcustPersonDetailKey();
        tcustPersonDetailKey.setPersoncode(personcode);
        tcustPersonDetail.setPk(tcustPersonDetailKey);
    }
    /*
     * (non-Javadoc)
     * 
     * @see com.fp.dto.rules.TransactionRule#reverseProcess(com.fp.dto.save.SaveRequest)
     */
    @Override
    public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
        return pSaveRequest;
    }

    /**
     * Metodo que devuelve la secuencia del codigo
     * @param codigoSec
     * @return String
     * @throws Exception
     */
    private String getCodigo(String codigoSec) throws Exception {
        Sequence sequence = new Sequence();
        Integer solcitud = Integer.valueOf(sequence.getNextValue(codigoSec).toString());
        return solcitud.toString();
    }
    /**
     * Genera el numero de transaccion para la custodia
     */
    private String getNumeroTransaccion(String prefijo,String secuencia){
		return prefijo+"-"+StringUtils.leftPad(secuencia, 6, '0');
    }

}
