package com.fp.armas.task.traspasodominio;

import java.math.BigDecimal;
import java.sql.Timestamp;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.persistence.EntityManager;

import com.fp.armas.rules.exception.ControlArmasException;
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.fun.TarmVentaArmaTem;
import com.fp.persistence.parmas.param.TarmTipoArmaExplosivo;
import com.fp.persistence.parmas.soli.TarmArmas;
import com.fp.sessionbeans.helper.Sequence;
import com.fp.simple.action.TaskAction;

/**
 * Clase que se encarga de buscar el grupo para asignar la tarea
 * una tarea.
 * 
 * @version 2.1
 */
public class TraspasoDominio extends TaskAction {


    /*
     * (non-Javadoc)
     * 
     * @see com.fp.simple.action.TaskAction#assignOwner(com.fp.dto.Request)
     */
    @SuppressWarnings({ "unchecked", "deprecation" })
    @Override
    public void assignOwner(Object pParam) throws Exception {
    	EntityManager em=PersistenceHelper.getEntityManager();
    	System.out.println("Ingresa a traspaso dominio");
        HashMap<String, Object> m = (HashMap<String, Object>) pParam;
        Map<String, Object> mrequest = (Map<String, Object>) m.get("request");
        if (mrequest.get("csolicitud") == null) {
        	m.put("grupo",null);
        	throw new ControlArmasException("BPM-0014", "SIN CODIGO", "");
        }
        String csolicitud=mrequest.get("csolicitud").toString();
        TarmArmas arma= TarmArmas.find(em, csolicitud);
        List<TarmVentaArmaTem>listaventa= em.createQuery("select p from TarmVentaArmaTem p where p.carma=:carma and p.estado=:estado")
        		.setParameter("carma", arma.getPk())
        		.setParameter("estado", "PENDIENTE")
        		.getResultList();
        for (TarmVentaArmaTem item : listaventa) {
        	item.setEstado("APROBADO");
        	em.merge(item);
		}
        arma.setEstadoventa(null);
        TarmRegistroArmas registro = TarmRegistroArmas.find(em, arma.getCregistro());
        
        //1nuevo TarmRegistroArma del nuevo propietario
  		TarmRegistroArmas registroArmaComprador= new TarmRegistroArmas();
  		registroArmaComprador.setPk(getCodigoRegistro());
  		registroArmaComprador.setPersoncode(listaventa.get(0).getPersoncodigo());
  		registroArmaComprador.setTiporegistro("VENT");
  		registroArmaComprador.setTiporegistrocodigo("TIPOREGISTRO");
  		registroArmaComprador.setFcreacion( new java.sql.Date(new Date().getTime())); 
  		em.persist(registroArmaComprador);
      	//2
        TarmMovimientoArmas tarmMovimientoArmas=new TarmMovimientoArmas();
        tarmMovimientoArmas.setPk(getCodigoMovimiento());
        tarmMovimientoArmas.setCarma(arma.getPk());
        tarmMovimientoArmas.setFactura(listaventa.get(0).getFactura());
        tarmMovimientoArmas.setNoregistro(listaventa.get(0).getNoregistra());
        tarmMovimientoArmas.setFecha(new Timestamp(new Date().getTime()));
        tarmMovimientoArmas.setPersoncodecomprador(listaventa.get(0).getPersoncodigo());
        tarmMovimientoArmas.setPersoncodevendedor(registro.getPersoncode());
        tarmMovimientoArmas.setTipomovimientocodigo("TIPOMOVIMIENTO");
        tarmMovimientoArmas.setTipomovimiento("VENT");
        tarmMovimientoArmas.setJustificacion(listaventa.get(0).getJustificacion());
        em.persist(tarmMovimientoArmas);em.flush();
        
        //3  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.getCantidad()));
  			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());
  		 em.merge(totalPersonaVendedor);em.flush();
        
  		//3.1. Se genera un registro de ING para el comprador
 		TarmTotalPersona totalPersonaComprador =totalPersona(em,arma.getCtipoarmaexplosivo(),tarmMovimientoArmas.getPersoncodecomprador());
 		totalPersonaComprador.setCarma(arma.getPk());
 		totalPersonaComprador.setIngresoegreso("ING");
 		Date fechaActual1=new Date();
		fechaActual1.setSeconds(fechaActual1.getSeconds()+2);
 		totalPersonaComprador.setFecha(new Timestamp(fechaActual1.getTime()));
 			totalPersonaComprador.setCantidadmovimiento(new BigDecimal(arma.getCantidad()));
 			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());
 		 em.merge(totalPersonaComprador);
 		
        
      //4 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());
		}
		 em.persist(armaVende);
		
		//4.1 Nuevo registro Arma con el nuevo propietario
		TarmArmas armaNuevoPropietario= (TarmArmas)arma.cloneMe();
		armaNuevoPropietario.setPk(getCodigoArmas());
		armaNuevoPropietario.setCregistro(registroArmaComprador.getPk());
		armaNuevoPropietario.setEstado("REG");
		Date fechaActual=new Date();
		fechaActual.setSeconds(fechaActual.getSeconds()+2);
		armaNuevoPropietario.setFecharegistro(new java.sql.Date(fechaActual.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());
		}
		 em.persist(armaNuevoPropietario);
		
    }
    
    private String getCodigoArmas() throws Exception {
        Sequence sequence = new Sequence();
        String codigoArma = sequence.getNextValue("CARMA").toString();
        return codigoArma;
    }
    private Long getCodigoRegistro() throws Exception {
        Sequence sequence = new Sequence();
        Long codigo = sequence.getNextValue("CREGISTRO").longValue();
        return codigo;
    }
    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;
    }
    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){
			TarmTotalPersona total=(TarmTotalPersona)tarmTotalPersonas.get(0).cloneMe();
			total.setPk(null);
			return total;
		}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;
		}
	}

}
