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

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
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.commondb.PersistenceHelper;
import com.fp.persistence.commondb.helper.FormatDates;
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.persistence.pcustomer.gene.TcustPerson;
import com.fp.persistence.pcustomer.gene.TcustPersonDetail;
import com.fp.persistence.pcustomer.gene.TcustPersonDetailKey;
import com.fp.persistence.pcustomer.gene.TcustPersonPhone;
import com.fp.persistence.pcustomer.gene.TcustPersonPhoneKey;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Clase que se encarga de completar información de una solicitud de control de armas.
 * 
 * @author C.P.
 * @version 2.1
 */
public class DecomisoMaterial 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 {
    	if (this.isNew(pSaveRequest)) {
            return pSaveRequest;
        }
    	//decomiso
   	 	if((List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DECOMISO") == null || ((TarmDecomiso)((List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DECOMISO")).get(0)).getPk()!=null){
   	 		return pSaveRequest;
   	 	}
    	//personas a crear
    	 List<Object> personDetailList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TCUSTPERSONDETAIL");
    	 //registro del arma
    	 List<Object> registroArmaList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TREGISTROARMAS");//seteado en el arma
    	 //arma a decomisar
    	 List<Object> armaList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("ARMAS");
    	 
    	 //detalle del decomiso
    	 List<Object> tarmDecomisoArma = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TARMDECOMISOARMA");//seteado en el decomiso
    	 //telefono
    	 List<Object> personPhoneList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TCUSTPERSONPHONE");
    	 //TREGISTROARMAS
    	 TcustPersonDetail personDetailPortador= null;
    	 for(Object obj:personDetailList){
    		 TcustPersonDetail personaDetail=(TcustPersonDetail)obj;
    		 if(personaDetail.getPk()==null || personaDetail.getPk().getPersoncode()==null){
    			 TcustPerson persona=new TcustPerson();
    			 persona.setPk(getPersonCode());
    			 //insertamos la persona
    			 PersistenceHelper.getEntityManager().persist(persona);
    			 completePersonDetail(personaDetail, persona.getPk());
    			 personaDetail.getPk().setDateto(FormatDates.getDefaultExpiryTimestamp());
    			 //inserta el detalle
    			 PersistenceHelper.getEntityManager().persist(personaDetail);
    		 }
    		 personDetailPortador=personaDetail;
    		 if(personPhoneList!=null){
				 for(Object objPhone:personPhoneList){
					 TcustPersonPhone telefono=(TcustPersonPhone)objPhone;
					 telefono.setPk(new TcustPersonPhoneKey());
					 telefono.getPk().setPhonesequence(1);
					 telefono.getPk().setDateto(FormatDates.getDefaultExpiryTimestamp());
					 telefono.getPk().setPersoncode(personDetailPortador.getPk().getPersoncode());
				 }
			 }
    	 }
    	
    	 //DECOMISO
    	 TarmDecomiso decomiso=null;
    	 //se inserta el DECOMISO cabecera
    	 for(Object obj:(List<Object>)pSaveRequest.getSaveBeanModifiedRecords("DECOMISO")){
    		 decomiso=(TarmDecomiso)obj;
    		 if(personDetailPortador!=null && personDetailPortador.getPk()!=null && personDetailPortador.getPk().getPersoncode()!=null){
    			 decomiso.setPersoncode(personDetailPortador.getPk().getPersoncode());
    		 }
    		 decomiso.setPk(Long.parseLong(getCodigo("CDECOMISO")));
    		 decomiso.setNumerotransaccion(getNumeroTransaccion(decomiso.getTipoproceso(), decomiso.getPk().toString()));
    	 }
    	 
    	 //registramos el arma y si ya existe le cambiamos de estado
    	 for(Object obj:armaList){
    		 TarmArmas arma=(TarmArmas)obj;
    		 TarmRegistroArmas registroArma=null;
    		 if(arma.getUnidadmedidacantidad()==null || arma.getUnidadmedidacantidad().trim().length()==0){
    			 arma.setUnidadmedidacantidad(arma.getModifiedData().get("unidadmedidadesc").toString());
    		 }
    		 //creamos el arma
    		 arma.setPk(getCodigo("CARMA"));
    		 //SI ES NUEVA CREA
    		 if(arma.getCodigoarma()==null || arma.getCodigoarma().trim().length()==0){
    			 arma.setCodigoarma(arma.getPk());
    		 }
    		 //REGISTRO ARMA
    		 if(arma.getModifiedData().get("personcode")!=null && arma.getModifiedData().get("tiporegistro")!=null){
    			 registroArma=new TarmRegistroArmas();
    			 //PK
    			 registroArma.setPk(Long.parseLong(getCodigo("CREGISTRO")));
	   			//personcode
    			 registroArma.setPersoncode(Integer.parseInt(arma.getModifiedData().get("personcode").toString()));
    			 registroArma.setTiporegistro(arma.getModifiedData().get("tiporegistro").toString());
    			 registroArma.setTiporegistrocodigo(arma.getModifiedData().get("tiporegistrocode").toString());
				//pais de origen
    			 registroArma.setPaisorigen(arma.getModifiedData().get("paisorigen").toString());
				//fecha de creacion
    			 registroArma.setFcreacion(new java.sql.Date(new Date().getTime()));  
    			 registroArmaList.add(registroArma);
    		 }
    		 
    		 //validamos el pk de REGISTROARMA
    		 if(registroArma!=null && registroArma.getPk()!=null){
    			 arma.setCregistro(registroArma.getPk());
    		 }
    		 //seteo del detalle del DECOMISOARMA  y a que arma se le hace el decomiso
    		 TarmDecomisoArma decomisoArma= new TarmDecomisoArma();
    		 decomisoArma.setCarma( arma.getPk());
    		 //estadoarma es igual que el estado del arma
    		 decomisoArma.setEstado(arma.getEstado());
    		 decomisoArma.setEstadocode(arma.getEstadocodigo());
    		//motivo del decomiso
    		 decomisoArma.setMotivodecomiso(arma.getModifiedData().get("motivocatalogo").toString());//motivo
    		 decomisoArma.setMotivodecomisocodigo(arma.getModifiedData().get("motivocatalogocode").toString());//1
    		 //observacion
    		 decomisoArma.setObservacion(arma.getModifiedData().get("observaciondecomiso").toString());
    		 //cantidad
    		 decomisoArma.setCantidad(new BigDecimal(arma.getModifiedData().get("cantidad").toString()));//cantidad
    		 //unidad del arma o material explosivo
    		 
    		 decomisoArma.setUnidadmedida(arma.getUnidadmedidacantidad());//unidad de medida
    		 decomisoArma.setUnidadmedidacode(arma.getUnidadmedidacantidadcodigo());//3
    		 //fecha del decomiso arma la actual
    		 decomisoArma.setFdecomiso(new Timestamp(new java.util.Date().getTime()));
    		//codigo del decomiso
    		 decomisoArma.setPk(getCodigo("CDECOMISOARMA"));
    		//codigo del decomiso
    		 decomisoArma.setCdecomiso(decomiso.getPk());
    		 //en bodega
    		 decomisoArma.setEnbodega("Y");
    		 tarmDecomisoArma.add(decomisoArma);
    	 }
    	 
    	 
    	 pSaveRequest.getResponse().put("numerotransaccion",decomiso.getNumerotransaccion());
    	 //datos para el flujo
    	 pSaveRequest.getResponse().put("cdecomiso", decomiso.getPk());
    	 
        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();
        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');
    }

}
