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




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.param.TarmTipoSancion;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.persistence.parmas.soli.TarmDecomisoArma;
import com.fp.persistence.parmas.soli.TarmSancionDecomiso;
import com.fp.persistence.parmas.soli.TarmSancionRecomendacion;
import com.fp.sessionbeans.helper.Sequence;


/**
 * @author Andres Cevallos
 * Clase que ingresa un registro de evaluación psicológica y la registra
 */
/**
 * @author Andres Cevallos
 *
 */
public class Sancionar extends TransactionRule {
     String numerosancion;
	/**
	 * Se gestiona el estado del arma y el estado del documento habilitante
	 */
	private static final long serialVersionUID = 1L;
	
	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
		/*if (this.isNew(pSaveRequest)) {
            return pSaveRequest;
        }*/
		// 1 SETEO DE LOS AMPOS PARA LA SANCION TarmSancionDecomiso  *
		List<Object> lsanciondecomiso =(List<Object>) pSaveRequest.getSaveBeanModifiedRecords("SANCIONDECOMISO");
		// 2 RECOMENDACIONES  *
		List<Object> lrecomendacion = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("SANCIONRECOMENDACION");
		//3 TarmArmas Nuevo registro con el nuevo estado
		List<Object> larmas = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("ARMAS");
		// 4 TarmDecomisoArma actualiza el estado
		List<Object> larmasDecomisadas = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TARMDECOMISOARMA");
		
		if(lsanciondecomiso!=null && !lsanciondecomiso.isEmpty()){						
			TarmSancionDecomiso sanciondecomiso = (TarmSancionDecomiso) lsanciondecomiso.get(0);
			//Genera el codigo compuesto de sancion
			sanciondecomiso.getPk().setCsanciondecomiso(getCodigoSancion());
			numerosancion=sanciondecomiso.getPk().getCsanciondecomiso();
			sanciondecomiso.setNoresolucion("ENV"+"-"+StringUtils.leftPad(numerosancion, 9, '0'));
			//recorremos las recomendaciones
			if(lrecomendacion!=null && !lrecomendacion.isEmpty()){//lrecomendacion
				for(Object recomendacion : lrecomendacion){
					TarmSancionRecomendacion  recomendacionObj= (TarmSancionRecomendacion) recomendacion;
					 recomendacionObj.setPk(getCodigoRecomendacion());
					 recomendacionObj.setCsanciondecomiso(sanciondecomiso.getPk().getCsanciondecomiso());
					 recomendacionObj.setCdecomiso(sanciondecomiso.getPk().getCdecomiso());	
				 }
			}
			//Registro del arma sancionada TarmArma
			TarmArmas armaSancionObj=(TarmArmas) sanciondecomiso.getModifiedData().get("arma");
			armaSancionObj.setIsnew(true);
			armaSancionObj.setFecharegistro(new java.sql.Date(new Date().getDate()));
			armaSancionObj.setPk(getCodigoArmas());
			//VALIDAMOS EL TIPO DE SANCION
			TarmTipoSancion tipoSancionObj = TarmTipoSancion.find(PersistenceHelper.getEntityManager(), sanciondecomiso.getCtiposancion());
			if(tipoSancionObj!=null){
				System.out.println("sancion ...."+tipoSancionObj.getSancion());
				if(tipoSancionObj.getSancion().equals("1")){
					// CUANDO LA SANCION ESCOGIDA ES UNA CANCELACION DE PERMISO
					armaSancionObj.setEstado("CANC");
					armaSancionObj.setEstadocodigo("ESTADOARMA");
					armaSancionObj.setFecharegistro(new java.sql.Date(new Date().getTime()));
				}else if(tipoSancionObj.getSancion().equals("2")){
					// CUANDO LA SANCION ESCOGIDA ES UNA SUSPENCION DE PERMISO
					armaSancionObj.setEstado("SUSP");
					armaSancionObj.setEstadocodigo("ESTADOARMA");
					armaSancionObj.setFecharegistro(new java.sql.Date(new Date().getTime()));
				}else if(tipoSancionObj.getSancion().equals("SANCIONSINDOC")){
					//cuando no tiene documento para sancionar se le deja en estado incautado
					armaSancionObj.setEstado("INC");
					armaSancionObj.setEstadocodigo("ESTADOARMA");
					armaSancionObj.setFecharegistro(new java.sql.Date(new Date().getTime()));
				}else{
					throw new Exception("SANCI\u00d3N NO ENCONTRADA : "+tipoSancionObj.getSancion());
				}
			}else{
				throw new Exception("TIPO DE SANCI\u00d3N NO ENCONTRADA");
			}
			larmas.add(armaSancionObj);
			//Registro del armaDECOMISO TarmDecomisoArma
			TarmDecomisoArma tarmDecomisoArma = (TarmDecomisoArma) armaSancionObj.getModifiedData().get("decomisoArma");
			tarmDecomisoArma.setEstado(armaSancionObj.getEstado());
			larmasDecomisadas.add(tarmDecomisoArma);
		}
		return pSaveRequest;
	}
	
	
	@Override
	public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
		return pSaveRequest;
	}
	
	
    /**
     * Obtiene el codigo de la evaluacion
     * @return
     * @throws Exception
     */
    private String getCodigoRecomendacion() throws Exception {
        Sequence sequence = new Sequence();
        String codigo = sequence.getNextValue("CSANCIONRECOMENDACION").toString();        
        return codigo;
    	
    }
    
    
    private String getCodigoSancion() throws Exception {
        Sequence sequence = new Sequence();
        String codigo = sequence.getNextValue("CSANCIONDECOMISO").toString();        
        return codigo;
    	
    }
    
    private String getCodigoArmas() throws Exception {
        Sequence sequence = new Sequence();
        String codigoArma = sequence.getNextValue("CARMA").toString();        
        return codigoArma;
    	
    }
  


}