package com.fp.viaticos.rules.save.acumulados;

import java.math.BigDecimal;
import java.sql.Date;
import java.util.Calendar;
import java.util.List;

import com.fp.common.helper.Constant;
import com.fp.dto.rules.TransactionRule;
import com.fp.dto.save.SaveRequest;
import com.fp.persistence.commondb.PersistenceHelper;
import com.fp.persistence.pviaticos.param.ViaDiasAcumulados;
import com.fp.persistence.pviaticos.param.ViaDiasAcumuladosKey;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitud;
import com.fp.persistence.pviaticos.solicitud.ViaSolicitudKey;
import com.fp.viaticos.rules.enums.EnumCodigos;
/**
 * Clase que se encarga de completar información para acumulacion de dias en la solicitud de viaticos.
 * 
 * @author WPA.
 * @version 2.1
 */
public class DiasAcumulados extends TransactionRule  {

	private static final long serialVersionUID = 1L;
	
	@Override
	public SaveRequest normalProcess(SaveRequest pSaveRequest) throws Exception {
		if (Constant.ifYes((String) pSaveRequest.get("isnew")) || pSaveRequest.get("csolicitud") == null) {
            return pSaveRequest;
        }
		
		String solicitud = (String)pSaveRequest.get("csolicitud");
		
		ViaSolicitud informe = ViaSolicitud.find(PersistenceHelper.getEntityManager(), new ViaSolicitudKey(solicitud, EnumCodigos.INFORME.getCodigo()));
		if(informe == null){
			return pSaveRequest;
		}
		
		ViaDiasAcumuladosKey key = new ViaDiasAcumuladosKey();
		key.setCod_destino(informe.getCod_destino());
		key.setCod_ejercicio(this.getYear(informe.getFec_creacion()));
		key.setCod_empleado(informe.getCod_empleado());
		
        ViaDiasAcumulados acumulado = ViaDiasAcumulados.find(PersistenceHelper.getEntityManager(), key);
        
        if(acumulado!=null){
        	BigDecimal dias = acumulado.getNum_dias().add(informe.getNum_dias());
        	acumulado.setNum_dias(dias);
        	
        }else{
        	acumulado = new ViaDiasAcumulados();
        	acumulado.setPk(key);
        	acumulado.setNum_dias(informe.getNum_dias());
        	PersistenceHelper.saveOrUpdate(acumulado);
        }

        return pSaveRequest;
	}

	@Override
	public SaveRequest reverseProcess(SaveRequest pSaveRequest) throws Exception {
		return pSaveRequest;
	}
	
	/**
	 * Entrega el anio
	 * @param date Fecha
	 * @return year
	 */
	private Integer getYear(Date date){
		Calendar calendar = Calendar.getInstance();
        calendar.setTime(date);
        return calendar.get(Calendar.YEAR);
	}

}
