package com.fp.person.rules.save;

import java.sql.Timestamp;
import java.util.Calendar;
import java.util.List;

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.pcustomer.company.TcustCompany;
import com.fp.persistence.pcustomer.company.TcustCompanyKey;
import com.fp.persistence.pcustomer.gene.TcustPerson;
import com.fp.persistence.pcustomer.gene.TcustPersonAddress;
import com.fp.persistence.pcustomer.gene.TcustPersonAddressKey;
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;

public class JuridicalPerson extends TransactionRule {
	
	private static final long serialVersionUID = 1L;
	
	@SuppressWarnings("unchecked")
	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
		try {
			TcustPersonDetail detallesPersona=(TcustPersonDetail)pSaveRequest.get("PERSON");
			TcustCompany company=(TcustCompany)pSaveRequest.get("COMPANY");	
			List<TcustPersonAddress> direcciones=(List<TcustPersonAddress>)pSaveRequest.get("ADDRESSES");
			List<TcustPersonPhone> telefonos=(List<TcustPersonPhone>)pSaveRequest.get("PHONES");
			
			//Persistiendo el TCUSTPERSON
			TcustPersonDetailKey pkDetallesPersona=new TcustPersonDetailKey();
			
			Calendar calendarioDateto=Calendar.getInstance();
			calendarioDateto.set(Calendar.YEAR, 2999);
			calendarioDateto.set(Calendar.MONTH, Calendar.DECEMBER);
			calendarioDateto.set(Calendar.DAY_OF_MONTH,31);
			calendarioDateto.set(Calendar.MILLISECOND, 0);
			calendarioDateto.set(Calendar.SECOND, 0);
			calendarioDateto.set(Calendar.MINUTE, 0);
			calendarioDateto.set(Calendar.HOUR, 0);

			//Caso en que la persona es nueva
			if(detallesPersona.isnew && (detallesPersona.getPk()==null || detallesPersona.getPk().getPersoncode()==null)){
				Sequence sequence = new Sequence();
				Integer personcode=Integer.valueOf(sequence.getNextValue("PERSONCODE").toString());
				TcustPerson persona=new TcustPerson();
				if(personcode!=null){
					persona.setPk(personcode);
					pkDetallesPersona.setPersoncode(personcode);
					//PersistenceHelper.getEntityManager().persist(persona);					
				}				

				pkDetallesPersona.setDateto(FormatDates.getDefaultExpiryTimestamp());				
				detallesPersona.setPk(pkDetallesPersona);				
			}else{
				pkDetallesPersona=detallesPersona.getPk();
			}
			
			//Persistiendo el TCUSTPERSONDETAIL
			if(!detallesPersona.isnew){
				detallesPersona=(TcustPersonDetail)PersistenceHelper.getEntityManager().merge(detallesPersona);
			}
			//PersistenceHelper.getEntityManager().persist(detallesPersona);
	        
			//Persistiendo el TCUSTCOMPANY
			//Caso en que la compannia es nueva
	      //  if(company.isnew && (company.getPk()==null || company.getPk().getPersoncode()==null)){
		        TcustCompanyKey pkJuridica=new TcustCompanyKey();
		       // pkJuridica.setDateto(new Timestamp(calendarioDateto.getTimeInMillis()));
		        pkJuridica.setDateto(FormatDates.getDefaultExpiryTimestamp());
		        pkJuridica.setPersoncode(pkDetallesPersona.getPersoncode());
		        company.setPk(pkJuridica);	        	
	      //  }
	        
/*			if(!company.isnew){
				company=(TcustCompany)PersistenceHelper.getEntityManager().merge(company);
			}*/
	       // PersistenceHelper.getEntityManager().persist(company);
	        	        
	        //Persistiendo las direcciones
	        for (TcustPersonAddress direccion : direcciones) {
				if(direccion.getPk()!=null && direccion.getPk().getAddressnumber()!=null && direccion.getPk().getPersoncode()!=null && direccion.getPk().getDateto()!=null){
					direccion=PersistenceHelper.getEntityManager().merge(direccion);
					//PersistenceHelper.getEntityManager().persist(direccion);
				}else{
					TcustPersonAddressKey pkDireccion=new TcustPersonAddressKey();
					pkDireccion.setPersoncode(pkDetallesPersona.getPersoncode());
					pkDireccion.setDateto(FormatDates.getDefaultExpiryTimestamp());
					
					direccion.setPk(pkDireccion);
					direccion.setDatefrom(new Timestamp(Calendar.getInstance().getTimeInMillis()));
					PersistenceHelper.getEntityManager().persist(direccion);
				}
			}
	        
	        //Persistiendo los telefonos	        
	        for (TcustPersonPhone telefono : telefonos) {
				if(telefono.getPk()!=null && telefono.getPk().getPersoncode()!=null){
					telefono=PersistenceHelper.getEntityManager().merge(telefono);
					//PersistenceHelper.getEntityManager().persist(telefono);
				}else{
					TcustPersonPhoneKey pkTelefono=new TcustPersonPhoneKey();
					pkTelefono.setPersoncode(pkDetallesPersona.getPersoncode());
					pkTelefono.setDateto(FormatDates.getDefaultExpiryTimestamp());
					
					telefono.setPk(pkTelefono);
					telefono.setDatefrom(new Timestamp(Calendar.getInstance().getTimeInMillis()));
					PersistenceHelper.getEntityManager().persist(telefono);
				}				
			}
	        
	       // PersistenceHelper.getEntityManager().flush();        
			
		} catch (Exception e) {
			return pSaveRequest;
		}
		return pSaveRequest;
	}
	
	@Override
	public SaveRequest reverseProcess(SaveRequest arg0) throws Exception {

		return arg0;
	}



}
