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

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

import javax.persistence.EntityManager;

import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.parmas.fun.TarmMovimientoArmas;
import com.fp.persistence.parmas.fun.TarmRegistroArmas;
import com.fp.persistence.parmas.fun.TarmTotalPersona;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.sessionbeans.helper.Sequence;

/**
 * Persiste las armas vendidas y los registros en caso de que sea venta
 * @author 
 *
 */
public class VentasVariasArmasMovimiento 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 {	
		EntityManager em = PersistenceHelper.getEntityManager();
		
		TarmMovimientoArmas tarmMovimientoArmas=(TarmMovimientoArmas)pSaveRequest.get("tarmMovimientoArmas");
		List<Object>tarmMovimientoArmasList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("MOVIMIENTO");
		List<Object>registroArmaCompradorList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("TREGISTROARMAS");
		List<Object>armaList = new ArrayList<>();
		List<Object>totalPersonaList = (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("VENTATOTALPERSONA");
		//recorremos la lista de armas
		List<Object> armas =  (List<Object>)pSaveRequest.getSaveBeanModifiedRecords("VENTAVARIASARMAS");
		if(armas.size()==0){
			TarmArmas armar=(TarmArmas)pSaveRequest.getSaveBeanModifiedObject("VENTAVARIASARMAS");
			armas.add(armar);
		}
		for (Object item : armas) {
			TarmArmas arma =(TarmArmas)item;
			//clonar movimiento por arma
			TarmMovimientoArmas tarmMovimientoArmasclon=(TarmMovimientoArmas) tarmMovimientoArmas.cloneMe();
			tarmMovimientoArmasclon.setCarma(arma.getPk());
			tarmMovimientoArmasclon.setPk(getCodigoMovimiento());
			//se llenan
			TarmRegistroArmas registroArmaComprador= new TarmRegistroArmas();
			//TODO
			llenarDatosVentaArmas(tarmMovimientoArmasclon,arma,registroArmaComprador,registroArmaCompradorList,armaList,totalPersonaList,em);
			
			tarmMovimientoArmasList.add(tarmMovimientoArmasclon);
		}
		armas.addAll(armaList);
		return pSaveRequest;
	}
	
	private void llenarDatosVentaArmas(TarmMovimientoArmas tarmMovimientoArmas,TarmArmas arma,
			TarmRegistroArmas registroArmaComprador,List<Object>registroArmaCompradorList,
			List<Object>armaList,List<Object>totalPersonaList,EntityManager em) throws Exception{
		//Si es venta
				if(tarmMovimientoArmas.getTipomovimiento().equals("VENT")){//----------------------------------------------------------------------------------------------------------------------------------
					//1 se genera un registro de arma con lo que se vende
					TarmArmas armaVende= (TarmArmas)arma.cloneMe();
					armaVende.setPk(getCodigoArmas());
					armaVende.setEstado("VEND");
					armaVende.setFecharegistro(new java.sql.Date(new Date().getTime()));
					if(armaVende.getCantidad()!=null && armaVende.getCantidad()>0 && armaVende.getValorAux()>0 ){
						armaVende.setCantidad(armaVende.getValorAux());
					}
					if(armaVende.getPeso()!=null && armaVende.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaVende.getPesoAux()!=null && armaVende.getPesoAux().compareTo(new BigDecimal(0))>0){
						armaVende.setPeso(armaVende.getPesoAux());
					}
					//2. se genera un registro de arma con lo q queda en REG
					TarmArmas armaQueda= (TarmArmas)arma.cloneMe();
					armaQueda.setPk(getCodigoArmas());
					armaQueda.setEstado("REG");
					armaQueda.setFecharegistro(new java.sql.Date(new Date().getTime()));
					Integer cantidadQueda=0;
					BigDecimal pesoQueda=new BigDecimal(0);
					if(armaQueda.getCantidad()!=null && armaQueda.getCantidad()>0 && armaQueda.getValorAux()>0 ){
						cantidadQueda=armaQueda.getCantidad()-armaQueda.getValorAux();
						armaQueda.setCantidad(cantidadQueda);
					}
					if(armaQueda.getPeso()!=null && armaQueda.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaQueda.getPesoAux()!=null && armaQueda.getPesoAux().compareTo(new BigDecimal(0))>0){
						pesoQueda=armaQueda.getPeso().subtract(armaQueda.getPesoAux());
						armaQueda.setPeso(pesoQueda);
					}
					//3.Nuevo TarmRegistroArma del nuevo propietario
					registroArmaComprador.setPk(getCodigoRegistro());
					registroArmaComprador.setPersoncode(tarmMovimientoArmas.getPersoncodecomprador());
					registroArmaComprador.setTiporegistro(tarmMovimientoArmas.getTipomovimiento());
					registroArmaComprador.setTiporegistrocodigo("TIPOREGISTRO");
					registroArmaComprador.setFcreacion( new java.sql.Date(new Date().getTime())); 
					
					//4.Nuevo registro Arma con el uevo propietario
					TarmArmas armaNuevoPropietario= (TarmArmas)arma.cloneMe();
					armaNuevoPropietario.setPk(getCodigoArmas());
					armaNuevoPropietario.setCregistro(registroArmaComprador.getPk());
					armaNuevoPropietario.setEstado("REG");
					armaNuevoPropietario.setFecharegistro(new java.sql.Date(new Date().getTime()));
					if(armaNuevoPropietario.getCantidad()!=null && armaNuevoPropietario.getCantidad()>0 && armaNuevoPropietario.getValorAux()>0 ){
						armaNuevoPropietario.setCantidad(armaNuevoPropietario.getValorAux());
					}
					if(armaNuevoPropietario.getPeso()!=null && armaNuevoPropietario.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaNuevoPropietario.getPesoAux()!=null && armaNuevoPropietario.getPesoAux().compareTo(new BigDecimal(0))>0){
						armaNuevoPropietario.setPeso(armaNuevoPropietario.getPesoAux());
					}
					//5. Se genera un registro TarmTotalPersona del que vende 
					TarmTotalPersona totalPersonaVendedor =totalPersona(em,arma.getCtipoarmaexplosivo(),tarmMovimientoArmas.getPersoncodevendedor());
					totalPersonaVendedor.setCarma(arma.getPk());
					totalPersonaVendedor.setIngresoegreso("EGR");
					totalPersonaVendedor.setFecha(new Timestamp(new Date().getTime()));
					
					if(arma.getCantidad()!=null && arma.getCantidad()>0 && arma.getValorAux()>0 ){
						totalPersonaVendedor.setCantidadmovimiento(new BigDecimal(arma.getValorAux()));
						if(totalPersonaVendedor.getTotal()==null){
							totalPersonaVendedor.setTotal(new BigDecimal(arma.getCantidad()));
						}
					}
					if(arma.getPeso()!=null && arma.getPeso().compareTo(new BigDecimal(0))>0 &&
							arma.getPesoAux()!=null && arma.getPesoAux().compareTo(new BigDecimal(0))>0){
						totalPersonaVendedor.setCantidadmovimiento(arma.getPesoAux());
						if(totalPersonaVendedor.getTotal()==null){
							totalPersonaVendedor.setTotal(arma.getPeso());
						}
					}
					totalPersonaVendedor.setCmovimiento(tarmMovimientoArmas.getPk());
					totalPersonaVendedor.setSaldoanterior(totalPersonaVendedor.getTotal());
					totalPersonaVendedor.setTotal(totalPersonaVendedor.getTotal().subtract(totalPersonaVendedor.getCantidadmovimiento()));
					totalPersonaVendedor.setPk(getCtotal());
					//6. Se genera un registro de ING para el comprador
					TarmTotalPersona totalPersonaComprador =totalPersona(em,arma.getCtipoarmaexplosivo(),tarmMovimientoArmas.getPersoncodecomprador());
					totalPersonaComprador.setCarma(arma.getPk());
					totalPersonaComprador.setIngresoegreso("ING");
					totalPersonaComprador.setFecha(new Timestamp(new Date().getTime()));
					
					if(arma.getCantidad()!=null && arma.getCantidad()>0 && arma.getValorAux()>0 ){
						totalPersonaComprador.setCantidadmovimiento(new BigDecimal(arma.getValorAux()));
						if(totalPersonaComprador.getTotal()==null){
							totalPersonaComprador.setTotal(new BigDecimal(0));
						}
					}
					if(arma.getPeso()!=null && arma.getPeso().compareTo(new BigDecimal(0))>0 &&
							arma.getPesoAux()!=null && arma.getPesoAux().compareTo(new BigDecimal(0))>0){
						totalPersonaComprador.setCantidadmovimiento(arma.getPesoAux());
						if(totalPersonaComprador.getTotal()==null){
							totalPersonaComprador.setTotal(new BigDecimal(0));
						}
					}
					totalPersonaComprador.setCmovimiento(tarmMovimientoArmas.getPk());
					totalPersonaComprador.setSaldoanterior(totalPersonaComprador.getTotal());
					totalPersonaComprador.setTotal(totalPersonaComprador.getTotal().add(totalPersonaComprador.getCantidadmovimiento()));
					totalPersonaComprador.setPk(getCtotal());
					//registroarmas
					registroArmaCompradorList.add(registroArmaComprador);
					//se aniade las armas
					armaList.add(armaVende);//VEND
					armaList.add(armaQueda);//REG
					armaList.add(armaNuevoPropietario);//REG
					//los registros del total de persona
					totalPersonaList.add(totalPersonaVendedor);
					totalPersonaList.add(totalPersonaComprador);
					arma=null;
				}else if(tarmMovimientoArmas.getTipomovimiento().equals("CONS") || tarmMovimientoArmas.getTipomovimiento().equals("MATP")
						||  tarmMovimientoArmas.getTipomovimiento().equals("MAT")){//-------------------------------------------------------------------------------------------------------------------------------
					System.out.println("tipo de movimiento consumidor......"+tarmMovimientoArmas.getTipomovimiento());
					if(tarmMovimientoArmas.getTipomovimiento().equals("MATP")){
						tarmMovimientoArmas.setTipomovimiento("MAT");
					}
					
					//1 se genera un registro de arma o explosivo de lo que se consume en estado CONS
					TarmArmas armaVende= (TarmArmas)arma.cloneMe();
					armaVende.setPk(getCodigoArmas());
					//armaVende.setEstado("CONS");
					armaVende.setEstado(tarmMovimientoArmas.getTipomovimiento());
					if(tarmMovimientoArmas.getTipomovimiento().equals("MAT")){
						armaVende.setEstado("MATP");
					}
					armaVende.setFecharegistro(new java.sql.Date(new Date().getTime()));
					if(armaVende.getCantidad()!=null && armaVende.getCantidad()>0 && armaVende.getValorAux()>0 ){
						armaVende.setCantidad(armaVende.getValorAux());
					}
					if(armaVende.getPeso()!=null && armaVende.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaVende.getPesoAux()!=null && armaVende.getPesoAux().compareTo(new BigDecimal(0))>0){
						armaVende.setPeso(armaVende.getPesoAux());
					}
					//2. se genera un registro de arma o explosivo con lo q queda en REG
					TarmArmas armaQueda= (TarmArmas)arma.cloneMe();
					armaQueda.setPk(getCodigoArmas());
					armaQueda.setEstado("REG");
					armaQueda.setFecharegistro(new java.sql.Date(new Date().getTime()));
					Integer cantidadQueda=0;
					BigDecimal pesoQueda=new BigDecimal(0);
					if(armaQueda.getCantidad()!=null && armaQueda.getCantidad()>0 && armaQueda.getValorAux()>0 ){
						cantidadQueda=armaQueda.getCantidad()-armaQueda.getValorAux();
						armaQueda.setCantidad(cantidadQueda);
					}
					if(armaQueda.getPeso()!=null && armaQueda.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaQueda.getPesoAux()!=null && armaQueda.getPesoAux().compareTo(new BigDecimal(0))>0){
						pesoQueda=armaQueda.getPeso().subtract(armaQueda.getPesoAux());
						armaQueda.setPeso(pesoQueda);
					}
					//3. Se genera un registro TarmTotalPersona del que esta consumiendo se resta 
					TarmTotalPersona totalPersonaVendedor =totalPersona(em,arma.getCtipoarmaexplosivo(),tarmMovimientoArmas.getPersoncodevendedor());
					totalPersonaVendedor.setCarma(arma.getPk());
					totalPersonaVendedor.setIngresoegreso("EGR");
					totalPersonaVendedor.setFecha(new Timestamp(new Date().getTime()));
					
					if(arma.getCantidad()!=null && arma.getCantidad()>0 && arma.getValorAux()>0 ){
						totalPersonaVendedor.setCantidadmovimiento(new BigDecimal(arma.getValorAux()));
						if(totalPersonaVendedor.getTotal()==null){
							totalPersonaVendedor.setTotal(new BigDecimal(arma.getCantidad()));
						}
					}
					if(arma.getPeso()!=null && arma.getPeso().compareTo(new BigDecimal(0))>0 &&
							arma.getPesoAux()!=null && arma.getPesoAux().compareTo(new BigDecimal(0))>0){
						totalPersonaVendedor.setCantidadmovimiento(arma.getPesoAux());
						if(totalPersonaVendedor.getTotal()==null){
							totalPersonaVendedor.setTotal(arma.getPeso());
						}
					}
					totalPersonaVendedor.setCmovimiento(tarmMovimientoArmas.getPk());
					totalPersonaVendedor.setSaldoanterior(totalPersonaVendedor.getTotal());
					totalPersonaVendedor.setTotal(totalPersonaVendedor.getTotal().subtract(totalPersonaVendedor.getCantidadmovimiento()));
					totalPersonaVendedor.setPk(getCtotal());
					
					//se aniade las armas
					armaList.add(armaVende);//CONS  arma que consume
					armaList.add(armaQueda);//REG lo que queda
					//los registros del total de persona
					totalPersonaList.add(totalPersonaVendedor);//total que le queda
					arma=null;
				}else if(tarmMovimientoArmas.getTipomovimiento().equals("TRASL")){//--------------------------------------------------------------------------------------------------------------------
					//1. se genera un registro de arma con lo q queda en REG
					TarmArmas armaQueda= (TarmArmas)arma.cloneMe();
					armaQueda.setPk(getCodigoArmas());
					armaQueda.setEstado("REG");
					armaQueda.setFecharegistro(new java.sql.Date(new Date().getTime()));
					Integer cantidadQueda=0;
					BigDecimal pesoQueda=new BigDecimal(0);
					if(armaQueda.getCantidad()!=null && armaQueda.getCantidad()>0 && armaQueda.getValorAux()>0 ){
						cantidadQueda=armaQueda.getCantidad()-armaQueda.getValorAux();
						armaQueda.setCantidad(cantidadQueda);
					}
					if(armaQueda.getPeso()!=null && armaQueda.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaQueda.getPesoAux()!=null && armaQueda.getPesoAux().compareTo(new BigDecimal(0))>0){
						pesoQueda=armaQueda.getPeso().subtract(armaQueda.getPesoAux());
						armaQueda.setPeso(pesoQueda);
					}
					//2.Nuevo TarmRegistroArma del nuevo propietario QUE SERIA LA MISMA PERSONA SE DIVIDE el explosivo
					registroArmaComprador.setPk(getCodigoRegistro());
					registroArmaComprador.setPersoncode(tarmMovimientoArmas.getPersoncodevendedor());
					registroArmaComprador.setTiporegistro(tarmMovimientoArmas.getTipomovimiento());
					registroArmaComprador.setTiporegistrocodigo("TIPOREGISTRO");
					registroArmaComprador.setFcreacion( new java.sql.Date(new Date().getTime())); 
					
					//4.Nuevo registro Arma con el uevo propietario
					TarmArmas armaNuevoPropietario= (TarmArmas)arma.cloneMe();
					armaNuevoPropietario.setPk(getCodigoArmas());
					armaNuevoPropietario.setCregistro(registroArmaComprador.getPk());
					armaNuevoPropietario.setEstado("REG");
					armaNuevoPropietario.setFecharegistro(new java.sql.Date(new Date().getTime()));
					if(armaNuevoPropietario.getCantidad()!=null && armaNuevoPropietario.getCantidad()>0 && armaNuevoPropietario.getValorAux()>0 ){
						armaNuevoPropietario.setCantidad(armaNuevoPropietario.getValorAux());
					}
					if(armaNuevoPropietario.getPeso()!=null && armaNuevoPropietario.getPeso().compareTo(new BigDecimal(0))>0 &&
							armaNuevoPropietario.getPesoAux()!=null && armaNuevoPropietario.getPesoAux().compareTo(new BigDecimal(0))>0){
						armaNuevoPropietario.setPeso(armaNuevoPropietario.getPesoAux());
					}
					//registroarmas
					registroArmaCompradorList.add(registroArmaComprador);
					//se aniade las armas
					armaList.add(armaQueda);//REG   se divide el explosivo
					armaList.add(armaNuevoPropietario);//REG
					arma=null;
				}
	}
	
	public TarmTotalPersona totalPersona(EntityManager em,String ctipoarmaexplosivo,Integer personcodigo) throws Exception{
		TarmTipoArmaExplosivo armaExplosivo= TarmTipoArmaExplosivo.find(em,ctipoarmaexplosivo);
		
		String sql ="select t from TarmTotalPersona t where t.clase='"+armaExplosivo.getClase()+"' and t.tipoarmaexplosivo='"+armaExplosivo.getTipoarmaexplosivo()+"' and t.unidadmedidapeso='"+armaExplosivo.getUnidadmedidapeso()+"' "
		           + " and t.personcodigo="+personcodigo+"  and t.fecha =(select max(t1.fecha) from TarmTotalPersona t1"
						 + " where t1.clase='"+armaExplosivo.getClase()+"' and t1.tipoarmaexplosivo='"+armaExplosivo.getTipoarmaexplosivo()+"' and t1.unidadmedidapeso='"+armaExplosivo.getUnidadmedidapeso()+"' "
						 + " and t1.personcodigo="+personcodigo+")";
		System.out.println("query totalPersoan....:"+sql);
		List<TarmTotalPersona>tarmTotalPersonas= em.createQuery(sql,TarmTotalPersona.class).getResultList();
		if(tarmTotalPersonas!=null && tarmTotalPersonas.size()>0){
			return tarmTotalPersonas.get(0);
		}else{
			TarmTotalPersona totalPersona= new TarmTotalPersona();
			totalPersona.setClase(armaExplosivo.getClase());
			totalPersona.setClasecodigo("CLASE");
			totalPersona.setTipoarmaexplosivo(armaExplosivo.getTipoarmaexplosivo());
			totalPersona.setTipoarmaexplosivocodigo("TIPOARMAEXPLOSIVO");
			totalPersona.setUnidadmedidapeso(armaExplosivo.getUnidadmedidapeso());
			totalPersona.setUnidadmedidapesocodigo("UNIDADMEDIDA");
			totalPersona.setPersoncodigo(personcodigo);
			totalPersona.setTotal(null);
			totalPersona.setSaldoanterior(new BigDecimal(0));
			totalPersona.setIngresoegresocodigo("ESINGRESOEGRESO");
			return totalPersona;
		}
	}
	
	@Override
	public SaveRequest reverseProcess(SaveRequest arg0) throws Exception {
		return arg0;
	}
	
	 /**
     * Metodo que devuelve la secuencia de un cliente.
     * @return Codigo del nuevo cliente.
     * @throws Exception
     */
    private Long getCodigoRegistro() throws Exception {
        Sequence sequence = new Sequence();
        Long codigo = sequence.getNextValue("CREGISTRO").longValue();
        return codigo;
    }
  
    /**
     * Obtiene el secuencial de Armas
     * @return
     * @throws Exception
     */
    private String getCodigoArmas() throws Exception {
        Sequence sequence = new Sequence();
        String codigoArma = sequence.getNextValue("CARMA").toString();
        return codigoArma;
    }
    
    /**
     * Obtiene el secuencial de movimientos
     * @return
     * @throws Exception
     */
    private String getCodigoMovimiento() throws Exception {
        Sequence sequence = new Sequence();
        String codigoArma = sequence.getNextValue("CMOVIMIENTO").toString();
        return codigoArma;
    }
    
    private String getCtotal() throws Exception {
        Sequence sequence = new Sequence();
        String codigoArma = sequence.getNextValue("CTOTAL").toString();
        return codigoArma;
    }
}




